Browse Source

维修工单

lyhzzz 2 years ago
parent
commit
62265e6f62
100 changed files with 4318 additions and 75 deletions
  1. 29 0
      pom.xml
  2. 23 1
      src/main/java/com/fdkankan/sale/SaleApplication.java
  3. 12 0
      src/main/java/com/fdkankan/sale/common/CacheUtil.java
  4. 7 0
      src/main/java/com/fdkankan/sale/common/FilePath.java
  5. 19 7
      src/main/java/com/fdkankan/sale/common/RequestBase.java
  6. 13 0
      src/main/java/com/fdkankan/sale/common/ResultCode.java
  7. 42 0
      src/main/java/com/fdkankan/sale/common/ThreadPoolUtil.java
  8. 6 6
      src/main/java/com/fdkankan/sale/config/WebAppConfig.java
  9. 15 6
      src/main/java/com/fdkankan/sale/controller/BaseController.java
  10. 33 0
      src/main/java/com/fdkankan/sale/controller/LaborCostController.java
  11. 4 4
      src/main/java/com/fdkankan/sale/controller/PartController.java
  12. 82 0
      src/main/java/com/fdkankan/sale/controller/RepairCustomerController.java
  13. 37 0
      src/main/java/com/fdkankan/sale/controller/RepairInfoController.java
  14. 36 0
      src/main/java/com/fdkankan/sale/controller/RepairInvoiceController.java
  15. 74 0
      src/main/java/com/fdkankan/sale/controller/RepairPersonnelController.java
  16. 109 0
      src/main/java/com/fdkankan/sale/controller/RepairSaleController.java
  17. 73 0
      src/main/java/com/fdkankan/sale/controller/RepairSupplyController.java
  18. 45 0
      src/main/java/com/fdkankan/sale/controller/RepairTestController.java
  19. 5 1
      src/main/java/com/fdkankan/sale/controller/SysRoleController.java
  20. 14 0
      src/main/java/com/fdkankan/sale/controller/SysUserController.java
  21. 3 5
      src/main/java/com/fdkankan/sale/controller/TestController.java
  22. 26 0
      src/main/java/com/fdkankan/sale/controller/UploadController.java
  23. 56 0
      src/main/java/com/fdkankan/sale/controller/pay/OrderWechatPayController.java
  24. 87 0
      src/main/java/com/fdkankan/sale/entity/Camera.java
  25. 159 0
      src/main/java/com/fdkankan/sale/entity/CameraDetail.java
  26. 74 0
      src/main/java/com/fdkankan/sale/entity/Customer.java
  27. 97 0
      src/main/java/com/fdkankan/sale/entity/CustomerAddress.java
  28. 2 2
      src/main/java/com/fdkankan/sale/entity/Fault.java
  29. 58 0
      src/main/java/com/fdkankan/sale/entity/LaborCost.java
  30. 96 0
      src/main/java/com/fdkankan/sale/entity/OrderReceiving.java
  31. 8 3
      src/main/java/com/fdkankan/sale/entity/Part.java
  32. 15 14
      src/main/java/com/fdkankan/sale/entity/PartLog.java
  33. 72 0
      src/main/java/com/fdkankan/sale/entity/PriceList.java
  34. 101 0
      src/main/java/com/fdkankan/sale/entity/Repair.java
  35. 59 0
      src/main/java/com/fdkankan/sale/entity/RepairComment.java
  36. 109 0
      src/main/java/com/fdkankan/sale/entity/RepairInvoice.java
  37. 70 0
      src/main/java/com/fdkankan/sale/entity/RepairLog.java
  38. 80 0
      src/main/java/com/fdkankan/sale/entity/RepairPay.java
  39. 78 0
      src/main/java/com/fdkankan/sale/entity/RepairRegister.java
  40. 63 0
      src/main/java/com/fdkankan/sale/entity/RepairRegisterPart.java
  41. 75 0
      src/main/java/com/fdkankan/sale/entity/RepairTest.java
  42. 2 2
      src/main/java/com/fdkankan/sale/entity/SysMenu.java
  43. 2 2
      src/main/java/com/fdkankan/sale/entity/SysRole.java
  44. 4 3
      src/main/java/com/fdkankan/sale/entity/SysUser.java
  45. 1 1
      src/main/java/com/fdkankan/sale/generate/AutoGenerate.java
  46. 8 2
      src/main/java/com/fdkankan/sale/httpClient/client/WxClient.java
  47. 1 0
      src/main/java/com/fdkankan/sale/interceptor/TokenInterceptor.java
  48. 18 0
      src/main/java/com/fdkankan/sale/mapper/ICameraDetailMapper.java
  49. 18 0
      src/main/java/com/fdkankan/sale/mapper/ICameraMapper.java
  50. 18 0
      src/main/java/com/fdkankan/sale/mapper/ICustomerAddressMapper.java
  51. 18 0
      src/main/java/com/fdkankan/sale/mapper/ICustomerMapper.java
  52. 18 0
      src/main/java/com/fdkankan/sale/mapper/ILaborCostMapper.java
  53. 21 0
      src/main/java/com/fdkankan/sale/mapper/IOrderReceivingMapper.java
  54. 4 0
      src/main/java/com/fdkankan/sale/mapper/IPartLogMapper.java
  55. 18 0
      src/main/java/com/fdkankan/sale/mapper/IPriceListMapper.java
  56. 18 0
      src/main/java/com/fdkankan/sale/mapper/IRepairCommentMapper.java
  57. 24 0
      src/main/java/com/fdkankan/sale/mapper/IRepairInvoiceMapper.java
  58. 23 0
      src/main/java/com/fdkankan/sale/mapper/IRepairLogMapper.java
  59. 29 0
      src/main/java/com/fdkankan/sale/mapper/IRepairMapper.java
  60. 18 0
      src/main/java/com/fdkankan/sale/mapper/IRepairPayMapper.java
  61. 21 0
      src/main/java/com/fdkankan/sale/mapper/IRepairRegisterMapper.java
  62. 18 0
      src/main/java/com/fdkankan/sale/mapper/IRepairRegisterPartMapper.java
  63. 21 0
      src/main/java/com/fdkankan/sale/mapper/IRepairTestMapper.java
  64. 661 0
      src/main/java/com/fdkankan/sale/pay/wx/WXPay.java
  65. 45 0
      src/main/java/com/fdkankan/sale/pay/wx/WXPayConstants.java
  66. 11 2
      src/main/java/com/fdkankan/sale/pay/wx/WXPayDefaultConfig.java
  67. 278 0
      src/main/java/com/fdkankan/sale/pay/wx/WXPayUtil.java
  68. 3 0
      src/main/java/com/fdkankan/sale/pay/wx/WXUtil.java
  69. 171 0
      src/main/java/com/fdkankan/sale/pay/wx/WechatPayService.java
  70. 16 0
      src/main/java/com/fdkankan/sale/service/ICameraDetailService.java
  71. 19 0
      src/main/java/com/fdkankan/sale/service/ICameraService.java
  72. 19 0
      src/main/java/com/fdkankan/sale/service/ICustomerAddressService.java
  73. 21 0
      src/main/java/com/fdkankan/sale/service/ICustomerService.java
  74. 16 0
      src/main/java/com/fdkankan/sale/service/ILaborCostService.java
  75. 22 0
      src/main/java/com/fdkankan/sale/service/IOrderReceivingService.java
  76. 1 1
      src/main/java/com/fdkankan/sale/service/IPartLogService.java
  77. 8 1
      src/main/java/com/fdkankan/sale/service/IPartService.java
  78. 22 0
      src/main/java/com/fdkankan/sale/service/IPriceListService.java
  79. 17 0
      src/main/java/com/fdkankan/sale/service/IRepairCommentService.java
  80. 20 0
      src/main/java/com/fdkankan/sale/service/IRepairInvoiceService.java
  81. 26 0
      src/main/java/com/fdkankan/sale/service/IRepairLogService.java
  82. 21 0
      src/main/java/com/fdkankan/sale/service/IRepairPayService.java
  83. 23 0
      src/main/java/com/fdkankan/sale/service/IRepairRegisterPartService.java
  84. 25 0
      src/main/java/com/fdkankan/sale/service/IRepairRegisterService.java
  85. 42 0
      src/main/java/com/fdkankan/sale/service/IRepairService.java
  86. 18 0
      src/main/java/com/fdkankan/sale/service/IRepairTestService.java
  87. 2 0
      src/main/java/com/fdkankan/sale/service/ISysRoleService.java
  88. 2 0
      src/main/java/com/fdkankan/sale/service/ISysUserService.java
  89. 22 0
      src/main/java/com/fdkankan/sale/service/impl/CameraDetailServiceImpl.java
  90. 57 0
      src/main/java/com/fdkankan/sale/service/impl/CameraServiceImpl.java
  91. 36 0
      src/main/java/com/fdkankan/sale/service/impl/CustomerAddressServiceImpl.java
  92. 36 0
      src/main/java/com/fdkankan/sale/service/impl/CustomerServiceImpl.java
  93. 20 0
      src/main/java/com/fdkankan/sale/service/impl/LaborCostServiceImpl.java
  94. 36 0
      src/main/java/com/fdkankan/sale/service/impl/OrderReceivingServiceImpl.java
  95. 17 7
      src/main/java/com/fdkankan/sale/service/impl/PartLogServiceImpl.java
  96. 27 5
      src/main/java/com/fdkankan/sale/service/impl/PartServiceImpl.java
  97. 40 0
      src/main/java/com/fdkankan/sale/service/impl/PriceListServiceImpl.java
  98. 27 0
      src/main/java/com/fdkankan/sale/service/impl/RepairCommentServiceImpl.java
  99. 102 0
      src/main/java/com/fdkankan/sale/service/impl/RepairCustomerService.java
  100. 0 0
      src/main/java/com/fdkankan/sale/service/impl/RepairInfoService.java

+ 29 - 0
pom.xml

@@ -20,6 +20,18 @@
     <dependencies>
     <dependencies>
 
 
         <dependency>
         <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+
+        <dependency>
             <groupId>com.fdkankan</groupId>
             <groupId>com.fdkankan</groupId>
             <artifactId>4dkankan-common-utils</artifactId>
             <artifactId>4dkankan-common-utils</artifactId>
             <version>3.0.0-SNAPSHOT</version>
             <version>3.0.0-SNAPSHOT</version>
@@ -31,6 +43,23 @@
             <version>3.0.0-SNAPSHOT</version>
             <version>3.0.0-SNAPSHOT</version>
         </dependency>
         </dependency>
 
 
+<!--        <dependency>-->
+<!--            <groupId>com.fdkankan</groupId>-->
+<!--            <artifactId>4dkankan-utils-fyun-parent</artifactId>-->
+<!--            <version>3.0.0-SNAPSHOT</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun-oss</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun-s3</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
 
 
         <dependency>
         <dependency>
             <groupId>mysql</groupId>
             <groupId>mysql</groupId>

+ 23 - 1
src/main/java/com/fdkankan/sale/SaleApplication.java

@@ -1,6 +1,9 @@
 package com.fdkankan.sale;
 package com.fdkankan.sale;
 
 
+import com.fdkankan.sale.common.CacheUtil;
 import org.mybatis.spring.annotation.MapperScan;
 import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@@ -14,10 +17,29 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 @EnableScheduling
 @EnableScheduling
 @ComponentScan(basePackages = {"com.fdkankan.*"})
 @ComponentScan(basePackages = {"com.fdkankan.*"})
 @MapperScan("com.fdkankan.**.mapper")
 @MapperScan("com.fdkankan.**.mapper")
-public class SaleApplication {
+public class SaleApplication implements CommandLineRunner {
+
+    @Value("${spring.profiles.active}")
+    private String environment;
+    @Value("${fyun.type}")
+    private String uploadType;
+    @Value("${fyun.bucket}")
+    private String bucket;
+    @Value("${fyun.host}")
+    private String host;
+    @Value("${main.url}")
+    private String mainUrl;
 
 
     public static void main(String[] args) {
     public static void main(String[] args) {
         SpringApplication.run(SaleApplication.class, args);
         SpringApplication.run(SaleApplication.class, args);
     }
     }
 
 
+    @Override
+    public void run(String... args) throws Exception {
+        CacheUtil.uploadType = uploadType;
+        CacheUtil.bucket = bucket;
+        CacheUtil.environment = environment;
+        CacheUtil.host = host;
+        CacheUtil.mainUrl = mainUrl;
+    }
 }
 }

+ 12 - 0
src/main/java/com/fdkankan/sale/common/CacheUtil.java

@@ -0,0 +1,12 @@
+package com.fdkankan.sale.common;
+
+import org.springframework.beans.factory.annotation.Value;
+
+public class CacheUtil {
+
+    public static String environment;
+    public static  String uploadType;
+    public static  String bucket;
+    public static  String host;
+    public static  String mainUrl;
+}

+ 7 - 0
src/main/java/com/fdkankan/sale/common/FilePath.java

@@ -0,0 +1,7 @@
+package com.fdkankan.sale.common;
+
+public class FilePath {
+
+    public static String file_path = "/home/backend/4dkankan/sale/file/%s/%s";
+    public static String oss_file_path = "sale/file/%s/%s";
+}

+ 19 - 7
src/main/java/com/fdkankan/sale/common/RequestBase.java

@@ -1,8 +1,10 @@
 package com.fdkankan.sale.common;
 package com.fdkankan.sale.common;
 
 
 import lombok.Data;
 import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
+import java.util.List;
 
 
 @Data
 @Data
 public class RequestBase implements Serializable {
 public class RequestBase implements Serializable {
@@ -11,13 +13,23 @@ public class RequestBase implements Serializable {
 
 
     private int pageSize = 10;
     private int pageSize = 10;
 
 
-    private int start;
+    private String startTime;
 
 
-    private String orderBy = "id";
+    private String endTime;
 
 
-    /**
-     * DESC-降序
-     * ASC-升序
-     */
-    private String sortBy = "DESC";
+    private List<String> timeList;
+
+    public String getStartTime() {
+        if(StringUtils.isBlank(startTime) && timeList != null && timeList.size() >0){
+            return timeList.get(0);
+        }
+        return startTime;
+    }
+
+    public String getEndTime() {
+        if(StringUtils.isBlank(startTime) && timeList != null && timeList.size() >1){
+            return timeList.get(1);
+        }
+        return endTime;
+    }
 }
 }

+ 13 - 0
src/main/java/com/fdkankan/sale/common/ResultCode.java

@@ -17,6 +17,19 @@ public enum ResultCode  {
     DEL_ROLE_ERROR(50035, "该角色已关联用户,不可删除。请先修改相关用户的角色!"),
     DEL_ROLE_ERROR(50035, "该角色已关联用户,不可删除。请先修改相关用户的角色!"),
     UPDATE_MYSELF_PASSWORD(50039, "只能修改自己的密码!"),
     UPDATE_MYSELF_PASSWORD(50039, "只能修改自己的密码!"),
     OLD_PASSWORD_ERROR(50037, "原密码错误"),
     OLD_PASSWORD_ERROR(50037, "原密码错误"),
+    PART_NOT_EXITS(60001, "备件不存在"),
+    CAMERA_SN_NOT_EXITS(60002, "SN码不存在"),
+    CAMERA_DETAIL_NOT_EXITS(60003, "SN码不存在!"),
+    REPAIR_NOT_EXITS(60004, "工单不存在!"),
+    REPAIR_STATUS_NOT_EXITS(60005, "工单状态错误!"),
+    UPLOAD_FILE_NO_EXIST(60006, "文件不存在!"),
+    UPLOAD_FILE_TO_LONG(60007, "文件大小超过限制!"),
+    CHECK_REGISTER_EXIST(60008, "已存在检测登记记录,缺少配件登记id"),
+    ORDER_PAY_ERROR(60009, "该订单已支付"),
+    ORDER_PAY_NOT_EXITS(60010, "该订单不存在"),
+    ORDER_COMMENT_EXITS(60011, "该订单已评论"),
+    ORDER_INVOICE_EXITS(60012, "该订单已申请开票"),
+    ORDER_NOt_PAY(60013, "该订单未支付"),
 
 
 
 
 
 

+ 42 - 0
src/main/java/com/fdkankan/sale/common/ThreadPoolUtil.java

@@ -0,0 +1,42 @@
+package com.fdkankan.sale.common;
+
+import java.util.concurrent.*;
+
+public class ThreadPoolUtil {
+
+
+
+    public static void printThreadPoolParameters() {
+        // 开始时间
+        long start = System.currentTimeMillis();
+        int pcount = Runtime.getRuntime().availableProcessors();
+        // 创建一个线程池
+        ThreadPoolExecutor executor = new ThreadPoolExecutor(pcount, pcount, 60, TimeUnit.SECONDS,
+                new ArrayBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
+
+        for (int i = 0; i < pcount; i++) {
+            executor.execute(() -> {
+                printThreadPoolStatus(executor);
+            });
+        }
+        executor.shutdown();
+        System.out.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
+    }
+
+    private  static void printThreadPoolStatus(ThreadPoolExecutor executor) {
+        BlockingQueue queue = executor.getQueue();
+        System.out.println(Thread.currentThread().getName() + "," +
+                "当前的线程数量:" + executor.getPoolSize() + "," +
+                "核心线程数:" + executor.getCorePoolSize() + "," +
+                "最大线程数:" + executor.getMaximumPoolSize() + "," +
+                "活动线程数:" + executor.getActiveCount() + "," +
+                "任务总数:" + executor.getTaskCount() + "," +
+                "任务完成数:" + executor.getCompletedTaskCount()+1 + "," +
+                "线程空闲时间:" + executor.getKeepAliveTime(TimeUnit.SECONDS) + "秒," +
+                "当前排队线程数:" + queue.size() + "," +
+                "队列剩余大小:" + queue.remainingCapacity() + "," +
+                "线程池是否关闭:" + executor.isShutdown() + ","
+        );
+    }
+
+}

+ 6 - 6
src/main/java/com/fdkankan/sale/config/WebAppConfig.java

@@ -17,12 +17,12 @@ public class WebAppConfig implements WebMvcConfigurer {
 	@Override
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
 	public void addInterceptors(InterceptorRegistry registry) {
 
 
-		registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
-				.excludePathPatterns(
-						"/**/test/**"
-				);
-
-		WebMvcConfigurer.super.addInterceptors(registry);
+//		registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
+//				.excludePathPatterns(
+//						"/**/test/**"
+//				);
+//
+//		WebMvcConfigurer.super.addInterceptors(registry);
 	}
 	}
 
 
 	@Override
 	@Override

+ 15 - 6
src/main/java/com/fdkankan/sale/controller/BaseController.java

@@ -2,16 +2,24 @@ package com.fdkankan.sale.controller;
 
 
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.interfaces.DecodedJWT;
 import com.auth0.jwt.interfaces.DecodedJWT;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
+import static com.baomidou.mybatisplus.core.toolkit.IdWorker.getId;
+
 @Component
 @Component
 public class BaseController {
 public class BaseController {
     @Autowired
     @Autowired
     protected HttpServletRequest request;
     protected HttpServletRequest request;
+    @Autowired
+    ISysUserService sysUserService;
 
 
     @Autowired
     @Autowired
     protected HttpServletResponse response;
     protected HttpServletResponse response;
@@ -23,12 +31,13 @@ public class BaseController {
     protected Long getUserId(){
     protected Long getUserId(){
         String token = request.getHeader("token");
         String token = request.getHeader("token");
         DecodedJWT jwt = JWT.decode(token);
         DecodedJWT jwt = JWT.decode(token);
-        return jwt.getClaim("userId").asLong();
-    }
-    protected String getNickName(){
-        String token = request.getHeader("token");
-        DecodedJWT jwt = JWT.decode(token);
-        return jwt.getClaim("nickName").asString();
+        Long userId = jwt.getClaim("userId").asLong();
+        SysUser sysUser = sysUserService.getByManageId(userId);
+        if(sysUser == null){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+
+        return sysUser.getId();
     }
     }
 
 
 
 

+ 33 - 0
src/main/java/com/fdkankan/sale/controller/LaborCostController.java

@@ -0,0 +1,33 @@
+package com.fdkankan.sale.controller;
+
+
+import com.fdkankan.sale.common.Result;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.service.ILaborCostService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@RestController
+@RequestMapping("/sale/laborCost")
+public class LaborCostController {
+
+    @Autowired
+    ILaborCostService laborCostService;
+
+    @GetMapping("/allList")
+    public ResultData allList(){
+        return ResultData.ok(laborCostService.list());
+    }
+}
+

+ 4 - 4
src/main/java/com/fdkankan/sale/controller/PartController.java

@@ -61,13 +61,13 @@ public class PartController extends BaseController {
         return ResultData.ok();
         return ResultData.ok();
     }
     }
 
 
-    @PostMapping("/in")
-    public ResultData in(@RequestBody Part part){
-       partService.inStock(part,getUserId(),getNickName());
+    @PostMapping("/inStock")
+    public ResultData inStock(@RequestBody Part part){
+       partService.inStock(part,getUserId());
         return ResultData.ok();
         return ResultData.ok();
     }
     }
 
 
-    @PostMapping("/inLog")
+    @PostMapping("/inStockLog")
     public ResultData inLog(@RequestBody RequestBase param){
     public ResultData inLog(@RequestBody RequestBase param){
         return ResultData.ok(partLogService.pageList(param));
         return ResultData.ok(partLogService.pageList(param));
     }
     }

+ 82 - 0
src/main/java/com/fdkankan/sale/controller/RepairCustomerController.java

@@ -0,0 +1,82 @@
+package com.fdkankan.sale.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.Post;
+import com.fdkankan.sale.common.CacheUtil;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.RepairComment;
+import com.fdkankan.sale.entity.RepairInvoice;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.httpClient.client.WxClient;
+import com.fdkankan.sale.pay.wx.WXPayDefaultConfig;
+import com.fdkankan.sale.pay.wx.WXUtil;
+import com.fdkankan.sale.service.IRepairCommentService;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.service.impl.RepairCustomerService;
+import com.fdkankan.sale.service.impl.RepairSaleService;
+import com.fdkankan.sale.vo.request.RecordingParam;
+import com.fdkankan.sale.vo.request.RepairParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/sale/customer")
+@Slf4j
+public class RepairCustomerController {
+
+    @Autowired
+    RepairCustomerService repairCustomerService;
+    @Autowired
+    RepairSaleService repairSaleService;
+    @Autowired
+    WxClient wxClient;
+
+    @GetMapping("/wxLogin")
+    public ResultData wxLogin(){
+        String getCodeUri = String.format(WXUtil.getCodeUriFmt,WXPayDefaultConfig.appId,WXPayDefaultConfig.secret);
+        return ResultData.ok(getCodeUri);
+    }
+
+    @GetMapping("/wxCallback")
+    public ResultData wxCallback(@RequestParam(required = false) String code){
+        log.info("wx-login----code:{}",code);
+        JSONObject object = wxClient.getToken(WXPayDefaultConfig.appId, WXPayDefaultConfig.secret, code);
+        return ResultData.ok(object);
+    }
+
+
+    @PostMapping("/cameraRepair")
+    public ResultData cameraRepair(@RequestBody RecordingParam repairParam){
+        repairSaleService.recording(repairParam,null,1);
+        return ResultData.ok();
+    }
+
+
+    @GetMapping("/getRepairByOpenId")
+    public ResultData getRepairByOpenId(@RequestParam(required = false) String wxOpenId){
+
+        return ResultData.ok(repairCustomerService.getRepairByOpenId(wxOpenId));
+    }
+
+    @PostMapping("/confirmRepair")
+    public ResultData confirmRepair(@RequestBody RepairParam param){
+        repairCustomerService.confirmRepair(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/comment")
+    public ResultData comment(@RequestBody RepairParam param){
+        repairCustomerService.comment(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/invoiceApply")
+    public ResultData invoiceApply(@RequestBody RepairInvoice param){
+        repairCustomerService.invoiceApply(param);
+        return ResultData.ok();
+    }
+}

+ 37 - 0
src/main/java/com/fdkankan/sale/controller/RepairInfoController.java

@@ -0,0 +1,37 @@
+package com.fdkankan.sale.controller;
+
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.service.impl.RepairInfoService;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/sale/repairInfo")
+public class RepairInfoController {
+
+    @Autowired
+    RepairInfoService repairInfoService;
+
+    @GetMapping("/details")
+    public ResultData details(@RequestParam(required = false) String repairId){
+        if(StringUtils.isBlank(repairId)){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+
+        return ResultData.ok(repairInfoService.getDetailsByRepairId(repairId));
+    }
+
+    @GetMapping("/process")
+    public ResultData process(@RequestParam(required = false) String repairId){
+        if(StringUtils.isBlank(repairId)){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+
+        return ResultData.ok(repairInfoService.getProcessByRepairId(repairId));
+    }
+}

+ 36 - 0
src/main/java/com/fdkankan/sale/controller/RepairInvoiceController.java

@@ -0,0 +1,36 @@
+package com.fdkankan.sale.controller;
+
+
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.RepairInvoice;
+import com.fdkankan.sale.service.IRepairInvoiceService;
+import com.fdkankan.sale.vo.request.RepairInvoiceParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+@RestController
+@RequestMapping("/sale/repairInvoice")
+public class RepairInvoiceController extends BaseController {
+
+    @Autowired
+    IRepairInvoiceService repairInvoiceService;
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody RepairInvoiceParam param){
+
+        return ResultData.ok(repairInvoiceService.pageList(param));
+    }
+}
+

+ 74 - 0
src/main/java/com/fdkankan/sale/controller/RepairPersonnelController.java

@@ -0,0 +1,74 @@
+package com.fdkankan.sale.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.OrderReceiving;
+import com.fdkankan.sale.entity.PriceList;
+import com.fdkankan.sale.entity.Repair;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.IPartService;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.service.impl.RepairPersonnelService;
+import com.fdkankan.sale.vo.request.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-12
+ */
+@RestController
+@RequestMapping("/sale/repairPersonnel")
+public class RepairPersonnelController extends BaseController{
+
+    @Autowired
+    RepairPersonnelService repairPersonnelService;
+    @Autowired
+    IPartService partService;
+
+    /**
+     * 维修工程师
+     * statusParam 0 待接单,1待跟进,2已完结
+     * status 0待接单,1待检测,2待报价,3待确认,4已取消,5待备料,6待回收,7维修中,8待测试,
+     *        9待支付(已完结),10待收货,11已发货,12已评价
+     */
+    @PostMapping("/repairOrderList")
+    public ResultData repairerOrderList(@RequestBody RepairParam param){
+
+        return ResultData.ok(repairPersonnelService.repairerOrderList(param));
+    }
+
+    /**
+     * 维修检测登记回显
+     */
+    @GetMapping("/checkRegisterInfo")
+    public ResultData checkRegisterInfo(@RequestParam(required = false) String repairId){
+        return ResultData.ok(repairPersonnelService.checkRegisterInfo(repairId));
+    }
+    /**
+     * 维修检测登记
+     */
+    @PostMapping("/checkRegister")
+    public ResultData checkRegister(@RequestBody CheckRegisterParam param){
+        repairPersonnelService.checkRegister(param,getUserId());
+        return ResultData.ok();
+    }
+    /**
+     * 维修完成
+     */
+    @PostMapping("/repairOver")
+    public ResultData repairOver(@RequestBody CheckRegisterParam param){
+        repairPersonnelService.repairOver(param,getUserId());
+        return ResultData.ok();
+    }
+
+
+}
+

+ 109 - 0
src/main/java/com/fdkankan/sale/controller/RepairSaleController.java

@@ -0,0 +1,109 @@
+package com.fdkankan.sale.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.Repair;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.IPartService;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.service.impl.RepairPersonnelService;
+import com.fdkankan.sale.service.impl.RepairSaleService;
+import com.fdkankan.sale.vo.request.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-12
+ */
+@RestController
+@RequestMapping("/sale/salePersonnel")
+public class RepairSaleController extends BaseController{
+
+    @Autowired
+    RepairSaleService repairSaleService;
+
+    /**
+     * 售后工程师
+     * statusParam 0 待接单,1待跟进,2已完结
+     * status 0待接单,1待检测,2待报价,3待确认,4已取消,5待备料,6待回收,7维修中,8待测试,
+     *        9待支付(已完结),10待收货,11已发货,12已评价
+     */
+    @PostMapping("/saleOrderList")
+    public ResultData saleOrderList(@RequestBody RepairParam param){
+        param.setUserId(getUserId());
+        return ResultData.ok(repairSaleService.saleOrderList(param));
+    }
+
+    /**
+     * 接单
+     */
+    @PostMapping("/orderReceiving")
+    public ResultData orderReceiving(@RequestBody OrderReceivingParam param){
+        repairSaleService.orderReceiving(param,getUserId());
+        return ResultData.ok();
+    }
+
+    /**
+     * 修改备注
+     */
+    @PostMapping("/updateRemark")
+    public ResultData updateRemark(@RequestBody RepairParam param){
+        if(param.getRepairId() == null || StringUtils.isBlank(param.getRemark())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        LambdaUpdateWrapper<Repair> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(Repair::getRepairId,param.getRepairId());
+        wrapper.set(Repair::getRemark,param.getRemark());
+        return ResultData.ok();
+    }
+
+    /**
+     * 系统录单
+     */
+    @PostMapping("/recording")
+    public ResultData recording(@RequestBody RecordingParam param){
+        repairSaleService.recording(param,getUserId(),0);
+        return ResultData.ok();
+    }
+
+    @GetMapping("/getPriceList")
+    public ResultData getPriceList(@RequestParam(required = false) String repairId){
+        return ResultData.ok(repairSaleService.getPriceList(repairId));
+    }
+
+    /**
+     * 添加报价单
+     */
+    @PostMapping("/addOrUpdatePriceList")
+    public ResultData addOrUpdatePriceList(@RequestBody PriceListParam param){
+        repairSaleService.addOrUpdatePriceList(param,getUserId());
+        return ResultData.ok();
+    }
+
+    /**
+     * 付款登记 0银行汇款
+     */
+    @PostMapping("/payRegister")
+    public ResultData payRegister(@RequestBody PayRegisterParam param){
+        repairSaleService.payRegister(param,getUserId());
+        return ResultData.ok();
+    }
+
+    /**
+     * 发货登记
+     */
+    @PostMapping("/sendRegister")
+    public ResultData sendRegister(@RequestBody PayRegisterParam param){
+        repairSaleService.sendRegister(param,getUserId());
+        return ResultData.ok();
+    }
+}
+

+ 73 - 0
src/main/java/com/fdkankan/sale/controller/RepairSupplyController.java

@@ -0,0 +1,73 @@
+package com.fdkankan.sale.controller;
+
+
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.Repair;
+import com.fdkankan.sale.service.IPartService;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.service.impl.RepairSupplyService;
+import com.fdkankan.sale.vo.request.CheckRegisterParam;
+import com.fdkankan.sale.vo.request.RepairParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-12
+ */
+@RestController
+@RequestMapping("/sale/supplyPersonnel")
+public class RepairSupplyController extends BaseController{
+
+    @Autowired
+    RepairSupplyService repairSupplyService;
+    @Autowired
+    IPartService partService;
+
+    /**
+     * 维修备件管理 供应链
+     * statusParam 0 待备料,1已备料,2待回收
+     * status 0待接单,1待检测,2待报价,3待确认,4已取消,5待备料,6待回收,7维修中,8待测试,
+     *        9待支付(已完结),10待收货,11已发货,12已评价
+     */
+    @PostMapping("/supplyOrderList")
+    public ResultData supplyOrderList(@RequestBody RepairParam param){
+
+        return ResultData.ok(repairSupplyService.supplyOrderList(param));
+    }
+
+    /**
+     * 备件出库详情回显
+     */
+    @GetMapping("/partInfo")
+    public ResultData partInfo(@RequestParam(required = false) String repairId,
+                                  @RequestParam(required = false,defaultValue = "0") Integer type){
+
+        return ResultData.ok(repairSupplyService.partInfo(repairId,type));
+    }
+
+    /**
+     * 确认出库
+     */
+    @PostMapping("/partOut")
+    public ResultData partOut(@RequestBody Repair param){
+        repairSupplyService.partOut(param,getUserId());
+        return ResultData.ok();
+    }
+
+    /**
+     * 备件回收
+     */
+    @PostMapping("/partRecovery")
+    public ResultData partRecovery(@RequestBody Repair param){
+        repairSupplyService.partRecovery(param,getUserId());
+        return ResultData.ok();
+    }
+
+
+}
+

+ 45 - 0
src/main/java/com/fdkankan/sale/controller/RepairTestController.java

@@ -0,0 +1,45 @@
+package com.fdkankan.sale.controller;
+
+
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.service.IRepairTestService;
+import com.fdkankan.sale.service.impl.RepairTesterService;
+import com.fdkankan.sale.vo.request.RepairParam;
+import com.fdkankan.sale.vo.request.TestParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.PushbackInputStream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-20
+ */
+@RestController
+@RequestMapping("/sale/repairTest")
+public class RepairTestController extends BaseController{
+
+    @Autowired
+    RepairTesterService repairTestService;
+
+    @PostMapping("/repairTesterList")
+    public ResultData testOrderList(@RequestBody RepairParam param){
+
+        return ResultData.ok(repairTestService.repairTesterList(param));
+    }
+
+    @PostMapping("/testPassOrFail")
+    public ResultData testPassOrFail(@RequestBody TestParam testParam){
+        repairTestService.passOrFail(testParam,getUserId());
+        return ResultData.ok();
+    }
+}
+

+ 5 - 1
src/main/java/com/fdkankan/sale/controller/SysRoleController.java

@@ -56,9 +56,13 @@ public class SysRoleController extends BaseController{
     }
     }
 
 
     @GetMapping("/allList")
     @GetMapping("/allList")
-    public ResultData allList(){
+    public ResultData allList(@RequestParam(required = false) Integer roleType){
         LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(SysRole::getStatus,1);
         wrapper.eq(SysRole::getStatus,1);
+        if(roleType !=null){
+            wrapper.eq(SysRole::getRoleType,roleType);
+        }
+        wrapper.orderByDesc(SysRole::getCreateTime);
         return ResultData.ok(roleService.list(wrapper));
         return ResultData.ok(roleService.list(wrapper));
     }
     }
 
 

+ 14 - 0
src/main/java/com/fdkankan/sale/controller/SysUserController.java

@@ -1,6 +1,7 @@
 package com.fdkankan.sale.controller;
 package com.fdkankan.sale.controller;
 
 
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.sale.common.ResultCode;
 import com.fdkankan.sale.common.ResultCode;
 import com.fdkankan.sale.common.ResultData;
 import com.fdkankan.sale.common.ResultData;
 import com.fdkankan.sale.entity.SysRole;
 import com.fdkankan.sale.entity.SysRole;
@@ -79,6 +80,7 @@ public class SysUserController extends BaseController{
         sysUserService.addOrUpdate(param);
         sysUserService.addOrUpdate(param);
         return ResultData.ok();
         return ResultData.ok();
     }
     }
+
     @PostMapping("/reMyselfPassword")
     @PostMapping("/reMyselfPassword")
     public ResultData reMyselfPassword(@RequestBody SysUserParam param){
     public ResultData reMyselfPassword(@RequestBody SysUserParam param){
         if(param.getId() == null || StringUtils.isEmpty(param.getNewPassword())){
         if(param.getId() == null || StringUtils.isEmpty(param.getNewPassword())){
@@ -95,5 +97,17 @@ public class SysUserController extends BaseController{
     public ResultData list(@RequestBody SysUserParam param){
     public ResultData list(@RequestBody SysUserParam param){
         return ResultData.ok(sysUserService.pageList(param));
         return ResultData.ok(sysUserService.pageList(param));
     }
     }
+
+    /**
+     *
+     * @param roleType 1超级管理员,2售后工程师,3维修工程师 4供应链管理员 5测试工程师
+     */
+    @GetMapping("/getByRoleType")
+    public ResultData getByRoleType(@RequestParam(required = false,defaultValue = "1") Integer roleType){
+        SysRole role = sysRoleService.getByRoleType(roleType);
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysUser::getRoleId,role.getId());
+        return ResultData.ok(sysUserService.list(wrapper));
+    }
 }
 }
 
 

+ 3 - 5
src/main/java/com/fdkankan/sale/controller/TestController.java

@@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.sound.midi.Soundbank;
 import javax.sound.midi.Soundbank;
+import java.util.LinkedList;
+import java.util.Scanner;
 
 
 @RestController
 @RestController
 @RequestMapping("/test")
 @RequestMapping("/test")
@@ -22,11 +24,7 @@ public class TestController {
 
 
 
 
     @GetMapping("/test1")
     @GetMapping("/test1")
-    public ResultData test1() throws Exception {
-        SysUser sysUser = new SysUser();
-        sysUser.setId(12L);
-        sysUser.setUserName("121323");
-        sysUserService.saveOrUpdate(sysUser);
+    public ResultData test1() {
         return ResultData.ok();
         return ResultData.ok();
     }
     }
 
 

+ 26 - 0
src/main/java/com/fdkankan/sale/controller/UploadController.java

@@ -0,0 +1,26 @@
+package com.fdkankan.sale.controller;
+
+import com.fdkankan.sale.common.FilePath;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.service.impl.UploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+@RequestMapping("/sale/upload")
+public class UploadController {
+
+    @Autowired
+    UploadService uploadService;
+
+    @PostMapping("/file")
+    public ResultData file(@RequestParam(required = false) MultipartFile file) throws Exception {
+
+        return ResultData.ok( uploadService.uploadFile(file));
+    }
+}

+ 56 - 0
src/main/java/com/fdkankan/sale/controller/pay/OrderWechatPayController.java

@@ -0,0 +1,56 @@
+package com.fdkankan.sale.controller.pay;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.constant.ConstantUrl;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.controller.BaseController;
+import com.fdkankan.sale.pay.wx.WechatPayService;
+import com.fdkankan.sale.util.UrlUtils;
+import com.fdkankan.sale.vo.request.WechatMobileParam;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.io.BufferedOutputStream;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+@Log4j2
+/**支付中心-微信支付模块"*/
+@Controller
+@RequestMapping("/sale/order/pay")
+public class OrderWechatPayController  extends BaseController {
+    @Autowired
+    WechatPayService wechatPayService;
+
+    @ResponseBody
+    @RequestMapping(value = "/wechatMobilePay", method = RequestMethod.POST)
+    public ResultData wechatMobilePay(@RequestBody WechatMobileParam param) throws Exception {
+        return ResultData.ok(wechatPayService.wechatMobilePay(param, UrlUtils.getIpAddr(request)));
+    }
+
+
+    @RequestMapping(value = "/wechatPay/notify", method = RequestMethod.POST)
+    public void callback() {
+        wechatPayService.callBack(request,response);
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/queryStatus", method = RequestMethod.POST)
+    public ResultData queryStatus(@RequestBody WechatMobileParam param) throws Exception {
+        return ResultData.ok(wechatPayService.queryStatus(param));
+    }
+
+
+}

+ 87 - 0
src/main/java/com/fdkankan/sale/entity/Camera.java

@@ -0,0 +1,87 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 相机主表
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+@Getter
+@Setter
+@TableName("t_camera")
+public class Camera implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 相机的Mac地址
+     */
+    @TableField("child_name")
+    private String childName;
+
+    /**
+     * 激活时间
+     */
+    @TableField("activated_time")
+    private Date activatedTime;
+
+    /**
+     * 相机密码
+     */
+    @TableField("child_password")
+    private String childPassword;
+
+    /**
+     * sn码
+     */
+    @TableField("sn_code")
+    private String snCode;
+
+    /**
+     * wifi名称
+     */
+    @TableField("wifi_name")
+    private String wifiName;
+
+    /**
+     * wifi密码
+     */
+    @TableField("wifi_password")
+    private String wifiPassword;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+
+}

+ 159 - 0
src/main/java/com/fdkankan/sale/entity/CameraDetail.java

@@ -0,0 +1,159 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 相机子表
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+@Getter
+@Setter
+@TableName("t_camera_detail")
+public class CameraDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 余额
+     */
+    @TableField("balance")
+    private String balance;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示客户,1表示员工,2表示赠送,3表示其他,4经销商销售
+     */
+    @TableField("own")
+    private Integer own;
+
+    /**
+     * 订单号
+     */
+    @TableField("order_sn")
+    private String orderSn;
+
+    /**
+     * 0表示本国,1表示国外
+     */
+    @TableField("country")
+    private Integer country;
+
+    /**
+     * 经销商
+     */
+    @TableField("agency")
+    private String agency;
+
+    /**
+     * 相机类型,0表示双目,1四维看看pro,2 四维看看lite,9 双目转台,10 激光转台
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 总容量
+     */
+    @TableField("total_space")
+    private Long totalSpace;
+
+    /**
+     * 已使用容量
+     */
+    @TableField("used_space")
+    private Long usedSpace;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 商品表t_goods的id
+     */
+    @TableField("goods_id")
+    private Long goodsId;
+
+    /**
+     * 企业表t_company的id
+     */
+    @TableField("company_id")
+    private Long companyId;
+
+    /**
+     * 代理商架构管理t_agent_framework的id
+     */
+    @TableField("agent_framework_id")
+    private Long agentFrameworkId;
+
+    /**
+     * 相机协作用户id
+     */
+    @TableField("cooperation_user")
+    private Long cooperationUser;
+
+    /**
+     * 设备地址(追溯管理后台)
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("user_camera_version")
+    private String userCameraVersion;
+
+    @TableField("app_version")
+    private String appVersion;
+
+    @TableField("last_request_time")
+    private Date lastRequestTime;
+
+    @TableField("out_time")
+    private Date outTime;
+
+    /**
+     * 代理商id
+     */
+    @TableField("agent_id")
+    private Integer agentId;
+
+
+}

+ 74 - 0
src/main/java/com/fdkankan/sale/entity/Customer.java

@@ -0,0 +1,74 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+@Getter
+@Setter
+@TableName("t_customer")
+public class Customer implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 报修用户表
+     */
+    @TableId(value = "customer_id", type = IdType.AUTO)
+    private Integer customerId;
+
+    /**
+     * 工单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+    /**
+     * 微信openId
+     */
+    @TableField("wx_open_id")
+    private String wxOpenId;
+
+    /**
+     * 公司名称
+     */
+    @TableField("company_name")
+    private String companyName;
+
+    /**
+     * 联系人,用户名称
+     */
+    @TableField("customer_name")
+    private String customerName;
+
+    /**
+     * 联系电话
+     */
+    @TableField("phone")
+    private String phone;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 97 - 0
src/main/java/com/fdkankan/sale/entity/CustomerAddress.java

@@ -0,0 +1,97 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+@Getter
+@Setter
+@TableName("t_customer_address")
+public class CustomerAddress implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 收件地址id
+     */
+    @TableId(value = "addr_id", type = IdType.AUTO)
+    private Integer addrId;
+
+    /**
+     * 用户ID
+     */
+    @TableField("customer_id")
+    private Integer customerId;
+
+    /**
+     * 工单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+    /**
+     * 收件地址
+     */
+    @TableField("get_address")
+    private String getAddress;
+
+    /**
+     * 收件人
+     */
+    @TableField("get_addr_name")
+    private String getAddrName;
+
+    /**
+     * 收件人电话
+     */
+    @TableField("get_addr_phone")
+    private String getAddrPhone;
+
+    /**
+     * 快递单号
+     */
+    @TableField("get_tracking_num")
+    private String getTrackingNum;
+    /**
+     * 送修方式 0 前台送修,1快递寄送
+     */
+    @TableField("send_type")
+    private Integer sendType;
+
+
+    /**
+     * 取回方式 0 前台取回,1快递寄回
+     */
+    @TableField("get_type")
+    private Integer getType;
+    /**
+     * 快递单号
+     */
+    @TableField("send_tracking_num")
+    private String sendTrackingNum;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 2 - 2
src/main/java/com/fdkankan/sale/entity/Fault.java

@@ -48,10 +48,10 @@ public class Fault implements Serializable {
     private String recStatus;
     private String recStatus;
 
 
     @TableField("create_time")
     @TableField("create_time")
-    private Date createTime;
+    private String createTime;
 
 
     @TableField("update_time")
     @TableField("update_time")
-    private Date updateTime;
+    private String updateTime;
 
 
 
 
 }
 }

+ 58 - 0
src/main/java/com/fdkankan/sale/entity/LaborCost.java

@@ -0,0 +1,58 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Getter
+@Setter
+@TableName("t_labor_cost")
+public class LaborCost implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人工费用
+     */
+    @TableId(value = "labor_cost_id", type = IdType.AUTO)
+    private Integer laborCostId;
+
+    /**
+     * 名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 价格
+     */
+    @TableField("price")
+    private BigDecimal price;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 96 - 0
src/main/java/com/fdkankan/sale/entity/OrderReceiving.java

@@ -0,0 +1,96 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+@Getter
+@Setter
+@TableName("t_order_receiving")
+public class OrderReceiving implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 接单记录
+     */
+    @TableId(value = "order_id",type = IdType.AUTO)
+    private Integer orderId;
+
+    /**
+     * 工单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+    /**
+     * 机器外观
+     */
+    @TableField("order_fault_msg")
+    private String orderFaultMsg;
+
+    /**
+     * 相关图片
+     */
+    @TableField("order_fault_img")
+    private String orderFaultImg;
+
+    /**
+     * 保修类型 0保修期内,1保修期外,2非保修项目
+     */
+    @TableField("warranty_type")
+    private Integer warrantyType;
+
+    /**
+     * 保修界面日期
+     */
+    @TableField("warranty_expiration_date")
+    private String warrantyExpirationDate;
+
+    /**
+     * 接单人
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+    /**
+     * 维修工程师
+     */
+    @TableField("repair_man_id")
+    private Long repairManId;
+
+
+    /**
+     * 供应链管理员
+     */
+    @TableField("supply_admin_id")
+    private Long supplyAdminId;
+
+    /**
+     * 测试工程师
+     */
+    @TableField("tester_id")
+    private Long testerId;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 8 - 3
src/main/java/com/fdkankan/sale/entity/Part.java

@@ -37,6 +37,11 @@ public class Part implements Serializable {
      */
      */
     @TableField("part_name")
     @TableField("part_name")
     private String partName;
     private String partName;
+    /**
+     * 备件名称
+     */
+    @TableField("part_num")
+    private String partNum;
 
 
     /**
     /**
      * 备件单位
      * 备件单位
@@ -57,7 +62,7 @@ public class Part implements Serializable {
     private Integer partStock;
     private Integer partStock;
 
 
     /**
     /**
-     * 相机类型
+     * 相机类型0看看,1看见,2深时
      */
      */
     @TableField("camera_type")
     @TableField("camera_type")
     private Integer cameraType;
     private Integer cameraType;
@@ -73,10 +78,10 @@ public class Part implements Serializable {
     private String recStatus;
     private String recStatus;
 
 
     @TableField("create_time")
     @TableField("create_time")
-    private Date createTime;
+    private String createTime;
 
 
     @TableField("update_time")
     @TableField("update_time")
-    private Date updateTime;
+    private String updateTime;
 
 
 
 
 }
 }

+ 15 - 14
src/main/java/com/fdkankan/sale/entity/PartLog.java

@@ -32,17 +32,10 @@ public class PartLog implements Serializable {
     private Integer partLogId;
     private Integer partLogId;
 
 
     /**
     /**
-     * 相机类型
-     */
-    @TableField("camera_type")
-    private Integer cameraType;
-
-    /**
      * 备件id
      * 备件id
      */
      */
     @TableField("part_id")
     @TableField("part_id")
     private Integer partId;
     private Integer partId;
-
     /**
     /**
      * 备件名称
      * 备件名称
      */
      */
@@ -50,29 +43,37 @@ public class PartLog implements Serializable {
     private String partName;
     private String partName;
 
 
     /**
     /**
-     * 入库数量
+     * 入库,出库数量
      */
      */
-    @TableField("in_count")
-    private Integer inCount;
+    @TableField("count")
+    private Integer count;
+    /**
+     * 0入库,1出库
+     */
+    @TableField("status")
+    private Integer status;
 
 
     /**
     /**
      * 操作人id
      * 操作人id
      */
      */
     @TableField("sys_user_id")
     @TableField("sys_user_id")
     private Long sysUserId;
     private Long sysUserId;
+    /**
+     * 报修Id
+     */
+    @TableField("repair_id")
+    private String repairId;
 
 
-    @TableField("sys_user_name")
-    private String sysUserName;
 
 
     @TableField("rec_status")
     @TableField("rec_status")
     @TableLogic(value = "A",delval = "I")
     @TableLogic(value = "A",delval = "I")
     private String recStatus;
     private String recStatus;
 
 
     @TableField("create_time")
     @TableField("create_time")
-    private Date createTime;
+    private String createTime;
 
 
     @TableField("update_time")
     @TableField("update_time")
-    private Date updateTime;
+    private String updateTime;
 
 
 
 
 }
 }

+ 72 - 0
src/main/java/com/fdkankan/sale/entity/PriceList.java

@@ -0,0 +1,72 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Getter
+@Setter
+@TableName("t_price_list")
+public class PriceList implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 报价单
+     */
+    @TableId(value = "price_list_id", type = IdType.AUTO)
+    private Integer priceListId;
+
+    /**
+     * 工单号
+     */
+    @TableField("repair_id")
+    private String repairId;
+
+    /**
+     * 项目名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 价格
+     */
+    @TableField("price")
+    private BigDecimal price;
+
+    @TableField("count")
+    private Integer count;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 0初始报价,1补充报价
+     */
+    @TableField("status")
+    private Integer status;
+
+}

+ 101 - 0
src/main/java/com/fdkankan/sale/entity/Repair.java

@@ -0,0 +1,101 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-12
+ */
+@Getter
+@Setter
+@TableName("t_repair")
+public class Repair implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 报修表  工单号
+     */
+    @TableId(value = "repair_id")
+    private String repairId;
+
+
+    /**
+     * 相机编码
+     */
+    @TableField("camera_sn_code")
+    private String cameraSnCode;
+
+    /**
+     * 相机类型
+     */
+    @TableField("camera_type")
+    private Integer cameraType;
+
+    /**
+     * 故障描述
+     */
+    @TableField("fault_msg")
+    private String faultMsg;
+
+    /**
+     * 故障相关图片
+     */
+    @TableField("fault_img")
+    private String faultImg;
+
+
+
+    /**
+     * 状态0待接单,1待检测,2待报价,3待确认,4已取消,5待备料,6待回收,7维修中,8待测试,9已完成,10待收货,11已发货,12已评价
+     */
+    @TableField("status")
+    private Integer status;
+    /**
+     * 评论状态 0 未评论,1已评论
+     */
+    @TableField("comment_status")
+    private Integer commentStatus;
+
+    /**
+     * 开票状态 0 未开票,1已开票
+     */
+    @TableField("invoice_status")
+    private Integer invoiceStatus;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 接单类型,0系统录单,1客户报修
+     */
+    @TableField("receiver_type")
+    private Integer receiverType;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+    @TableField("sys_user_id")
+    private Long sysUserId;
+}

+ 59 - 0
src/main/java/com/fdkankan/sale/entity/RepairComment.java

@@ -0,0 +1,59 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+@Getter
+@Setter
+@TableName("t_repair_comment")
+public class RepairComment implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 工单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+    /**
+     * 星级
+     */
+    @TableField("star_rank")
+    private String starRank;
+
+    /**
+     * 评论
+     */
+    @TableField("comment")
+    private String comment;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 109 - 0
src/main/java/com/fdkankan/sale/entity/RepairInvoice.java

@@ -0,0 +1,109 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+@Getter
+@Setter
+@TableName("t_repair_invoice")
+public class RepairInvoice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "invoice_id", type = IdType.AUTO)
+    private Integer invoiceId;
+
+    /**
+     * 工单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+
+    /**
+     * 开票金额
+     */
+    @TableField("invoice_amount")
+    private BigDecimal invoiceAmount;
+
+    /**
+     * 发票类型 0 普通发票,1专用发票
+     */
+    @TableField("invoice_type")
+    private Integer invoiceType;
+
+    /**
+     * 发票抬头
+     */
+    @TableField("invoice_head")
+    private String invoiceHead;
+
+    /**
+     * 税号
+     */
+    @TableField("invoice_num")
+    private String invoiceNum;
+
+    /**
+     * 收件邮箱
+     */
+    @TableField("invoice_email")
+    private String invoiceEmail;
+
+    /**
+     * 0未开票,1已开票
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 开户银行
+     */
+    @TableField("bank")
+    private String bank;
+
+    /**
+     * 银行账号
+     */
+    @TableField("bank_account")
+    private String bankAccount;
+
+    /**
+     * 企业地址
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 企业电话
+     */
+    @TableField("phone")
+    private String phone;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 70 - 0
src/main/java/com/fdkankan/sale/entity/RepairLog.java

@@ -0,0 +1,70 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+@Getter
+@Setter
+@TableName("t_repair_log")
+public class RepairLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 工单日志
+     */
+    @TableId(value = "repair_log_id", type = IdType.AUTO)
+    private Integer repairLogId;
+
+    /**
+     * 报修单
+     */
+    @TableField("repair_id")
+    private String repairId;
+
+    /**
+     * 报修单状态
+     */
+    @TableField("repair_status")
+    private Integer repairStatus;
+
+    /**
+     * 操作人
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 80 - 0
src/main/java/com/fdkankan/sale/entity/RepairPay.java

@@ -0,0 +1,80 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Getter
+@Setter
+@TableName("t_repair_pay")
+public class RepairPay implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 付款Id
+     */
+    @TableId(value = "pay_id", type = IdType.AUTO)
+    private Integer payId;
+
+    /**
+     * 工单号
+     */
+    @TableField("repair_id")
+    private String repairId;
+
+    /**
+     * 0银行转账,1微信,2支付宝
+     */
+    @TableField("pay_type")
+    private Integer payType;
+
+    /**
+     * 付款凭证,截图
+     */
+    @TableField("pay_img")
+    private String payImg;
+
+    @TableField("order_sn")
+    private String orderSn;
+
+    /**
+     * 支付状态 0 未支付,1支付成功,2支付失败
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    @TableField("wx_pay_open_id")
+    private String wxPayOpenId;
+
+    @TableField("trade_no")
+    private String tradeNo;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+}

+ 78 - 0
src/main/java/com/fdkankan/sale/entity/RepairRegister.java

@@ -0,0 +1,78 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Getter
+@Setter
+@TableName("t_repair_register")
+public class RepairRegister implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 维修登记
+     */
+    @TableId(value = "repair_register_id", type = IdType.AUTO)
+    private Integer repairRegisterId;
+
+    /**
+     * 报修单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+
+    /**
+     * 检测结果
+     */
+    @TableField("check_result")
+    private String checkResult;
+
+    /**
+     * 相关图片
+     */
+    @TableField("check_img")
+    private String checkImg;
+    /**
+     * 维修状态 0登记,1维修完成
+     */
+    @TableField("status")
+    private Integer status;
+    /**
+     * 维修记录
+     */
+    @TableField("remark")
+    private String remark;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+    @TableField("over_time")
+    private String overTime;
+
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+}

+ 63 - 0
src/main/java/com/fdkankan/sale/entity/RepairRegisterPart.java

@@ -0,0 +1,63 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Getter
+@Setter
+@TableName("t_repair_register_part")
+public class RepairRegisterPart implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("repair_id")
+    private String repairId;
+
+    @TableField("repair_register_id")
+    private Integer repairRegisterId;
+
+    @TableField("part_id")
+    private Integer partId;
+
+    @TableField("part_count")
+    private Integer partCount;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("recovery_status")
+    private Integer recoveryStatus;
+
+    @TableField("check_status")
+    private Integer checkStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+
+}

+ 75 - 0
src/main/java/com/fdkankan/sale/entity/RepairTest.java

@@ -0,0 +1,75 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-20
+ */
+@Getter
+@Setter
+@TableName("t_repair_test")
+public class RepairTest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "test_id", type = IdType.AUTO)
+    private Integer testId;
+
+    /**
+     * 工单id
+     */
+    @TableField("repair_id")
+    private String repairId;
+
+    /**
+     * 测试工程师
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+    /**
+     * 0测试通过,1测试不通过
+     */
+    @TableField("result_status")
+    private Integer resultStatus;
+
+    /**
+     * 测试详细描述
+     */
+    @TableField("result_info")
+    private String resultInfo;
+
+    /**
+     * 相关图片
+     */
+    @TableField("result_img")
+    private String resultImg;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+    @TableField("pass_time")
+    private String passTime;
+
+
+}

+ 2 - 2
src/main/java/com/fdkankan/sale/entity/SysMenu.java

@@ -84,10 +84,10 @@ public class SysMenu implements Serializable {
     private Integer isShow;
     private Integer isShow;
 
 
     @TableField("create_time")
     @TableField("create_time")
-    private Date createTime;
+    private String createTime;
 
 
     @TableField("update_time")
     @TableField("update_time")
-    private Date updateTime;
+    private String updateTime;
 
 
     @TableField("path")
     @TableField("path")
     private String path;
     private String path;

+ 2 - 2
src/main/java/com/fdkankan/sale/entity/SysRole.java

@@ -66,10 +66,10 @@ public class SysRole implements Serializable {
     private String description;
     private String description;
 
 
     @TableField("create_time")
     @TableField("create_time")
-    private Date createTime;
+    private String createTime;
 
 
     @TableField("update_time")
     @TableField("update_time")
-    private Date updateTime;
+    private String updateTime;
 
 
 
 
 }
 }

+ 4 - 3
src/main/java/com/fdkankan/sale/entity/SysUser.java

@@ -72,10 +72,11 @@ public class SysUser implements Serializable {
     private String recStatus;
     private String recStatus;
 
 
     @TableField("create_time")
     @TableField("create_time")
-    private Date createTime;
+    private String createTime;
 
 
     @TableField("update_time")
     @TableField("update_time")
-    private Date updateTime;
-
+    private String updateTime;
 
 
+    @TableField(value = "manage_id")
+    private Long manageId;
 }
 }

+ 1 - 1
src/main/java/com/fdkankan/sale/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
         String path =System.getProperty("user.dir");
 
 
         generate(path,"sale", getTables(new String[]{
         generate(path,"sale", getTables(new String[]{
-                "sys_menu","sys_role","sys_role_menu","sys_user"
+                "t_repair_invoice"
         }));
         }));
 
 
 //        generate(path,"goods", getTables(new String[]{
 //        generate(path,"goods", getTables(new String[]{

+ 8 - 2
src/main/java/com/fdkankan/sale/httpClient/client/WxClient.java

@@ -13,8 +13,14 @@ public interface WxClient {
     /**
     /**
      * 获取 access_token
      * 获取 access_token
      */
      */
-    @Get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential")
-    JSONObject getToken(@Query("appid") String app_id, @Query("secret") String app_secret);
+    @Get("https://open.weixin.qq.com/connect/oauth2/authorize?" +
+            "appid={appid}&redirect_uri={redirectUri}&response_type=code&scope=snsapi_base&state=123#wechat_redirect")
+    JSONObject getCode(@Query("appid") String app_id, @Query("redirectUri") String redirectUri);
+    /**
+     * 获取 access_token
+     */
+    @Get("https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code")
+    JSONObject getToken(@Query("appid") String app_id, @Query("secret") String app_secret,@Query("code") String code);
 
 
     /**
     /**
      * 申请账单
      * 申请账单

+ 1 - 0
src/main/java/com/fdkankan/sale/interceptor/TokenInterceptor.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpHeaders;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ICameraDetailMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.CameraDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机子表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+@Mapper
+public interface ICameraDetailMapper extends BaseMapper<CameraDetail> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ICameraMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.Camera;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+@Mapper
+public interface ICameraMapper extends BaseMapper<Camera> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ICustomerAddressMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.CustomerAddress;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+@Mapper
+public interface ICustomerAddressMapper extends BaseMapper<CustomerAddress> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ICustomerMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.Customer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+@Mapper
+public interface ICustomerMapper extends BaseMapper<Customer> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ILaborCostMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.LaborCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Mapper
+public interface ILaborCostMapper extends BaseMapper<LaborCost> {
+
+}

+ 21 - 0
src/main/java/com/fdkankan/sale/mapper/IOrderReceivingMapper.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.OrderReceiving;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.response.OrderReceivingVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+@Mapper
+public interface IOrderReceivingMapper extends BaseMapper<OrderReceiving> {
+
+    OrderReceivingVo getVoByRepairId(@Param("repairId") String repairId);
+}

+ 4 - 0
src/main/java/com/fdkankan/sale/mapper/IPartLogMapper.java

@@ -1,8 +1,11 @@
 package com.fdkankan.sale.mapper;
 package com.fdkankan.sale.mapper;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.sale.entity.PartLog;
 import com.fdkankan.sale.entity.PartLog;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.response.PartLogVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -15,4 +18,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 @Mapper
 public interface IPartLogMapper extends BaseMapper<PartLog> {
 public interface IPartLogMapper extends BaseMapper<PartLog> {
 
 
+    Page<PartLogVo> pageList(Page<Object> page, @Param("status")Integer status);
 }
 }

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IPriceListMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.PriceList;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Mapper
+public interface IPriceListMapper extends BaseMapper<PriceList> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairCommentMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.RepairComment;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+@Mapper
+public interface IRepairCommentMapper extends BaseMapper<RepairComment> {
+
+}

+ 24 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairInvoiceMapper.java

@@ -0,0 +1,24 @@
+package com.fdkankan.sale.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.entity.RepairInvoice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.request.RepairInvoiceParam;
+import com.fdkankan.sale.vo.response.RepairInvoiceVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+@Mapper
+public interface IRepairInvoiceMapper extends BaseMapper<RepairInvoice> {
+
+    Page<RepairInvoiceVo> pageList(Page<Object> page, RepairInvoiceParam param);
+}

+ 23 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairLogMapper.java

@@ -0,0 +1,23 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.RepairLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.response.RepairLogVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+@Mapper
+public interface IRepairLogMapper extends BaseMapper<RepairLog> {
+
+    List<RepairLogVo> getVoByRepairId(@Param("repairId") String repairId);
+}

+ 29 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairMapper.java

@@ -0,0 +1,29 @@
+package com.fdkankan.sale.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.entity.Repair;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.request.RepairParam;
+import com.fdkankan.sale.vo.response.RepairerVo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-12
+ */
+@Mapper
+public interface IRepairMapper extends BaseMapper<Repair> {
+
+    Page<RepairerVo> saleOrderList(Page<Object> page, RepairParam param);
+
+    Page<RepairerVo> supplyOrderList(Page<Object> page, RepairParam param);
+
+    Page<RepairerVo> repairerOrderList(Page<Object> page, RepairParam param);
+
+    Page<RepairerVo> testOrderList(Page<Object> page, RepairParam param);
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairPayMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.RepairPay;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Mapper
+public interface IRepairPayMapper extends BaseMapper<RepairPay> {
+
+}

+ 21 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairRegisterMapper.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.RepairRegister;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.response.RepairRegisterVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Mapper
+public interface IRepairRegisterMapper extends BaseMapper<RepairRegister> {
+
+    RepairRegisterVo getVoByRepairId(@Param("repairId") String repairId);
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairRegisterPartMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.RepairRegisterPart;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Mapper
+public interface IRepairRegisterPartMapper extends BaseMapper<RepairRegisterPart> {
+
+}

+ 21 - 0
src/main/java/com/fdkankan/sale/mapper/IRepairTestMapper.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.RepairTest;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.response.RepairTestVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-20
+ */
+@Mapper
+public interface IRepairTestMapper extends BaseMapper<RepairTest> {
+
+    RepairTestVo getVoByRepairId(@Param("repairId") String repairId);
+}

+ 661 - 0
src/main/java/com/fdkankan/sale/pay/wx/WXPay.java

@@ -0,0 +1,661 @@
+package com.fdkankan.sale.pay.wx;
+
+import org.springframework.stereotype.Service;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyStore;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPay {
+
+    private static WXPayConstants.SignType signType = WXPayConstants.SignType.MD5;
+    private static Boolean useSandbox = false;
+
+
+
+    /**
+     * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
+     * 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
+     *
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
+        reqData.put("appid", WXPayDefaultConfig.appId);
+        reqData.put("mch_id", WXPayDefaultConfig.mchId);
+        reqData.put("nonce_str", WXPayUtil.generateNonceStr());
+        if (WXPayConstants.SignType.MD5.equals(signType)) {
+            reqData.put("sign_type", WXPayConstants.MD5);
+        }
+        else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) {
+            reqData.put("sign_type", WXPayConstants.HMACSHA256);
+        }
+        reqData.put("sign", WXPayUtil.generateSignature(reqData, WXPayDefaultConfig.key, signType));
+        return reqData;
+    }
+
+    /**
+     * 判断xml数据的sign是否有效,必须包含sign字段,否则返回false。
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public static boolean isResponseSignatureValid(Map<String, String> reqData) throws Exception {
+        // 返回数据的签名方式和请求中给定的签名方式是一致的
+        return WXPayUtil.isSignatureValid(reqData, WXPayDefaultConfig.key, signType);
+    }
+
+    /**
+     * 判断支付结果通知中的sign是否有效
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public static boolean isPayResultNotifySignatureValid(Map<String, String> reqData) throws Exception {
+        String signTypeInData = reqData.get(WXPayConstants.FIELD_SIGN_TYPE);
+        WXPayConstants.SignType signType;
+        if (signTypeInData == null) {
+            signType = WXPayConstants.SignType.MD5;
+        }
+        else {
+            signTypeInData = signTypeInData.trim();
+            if (signTypeInData.length() == 0) {
+                signType = WXPayConstants.SignType.MD5;
+            }
+            else if (WXPayConstants.MD5.equals(signTypeInData)) {
+                signType = WXPayConstants.SignType.MD5;
+            }
+            else if (WXPayConstants.HMACSHA256.equals(signTypeInData)) {
+                signType = WXPayConstants.SignType.HMACSHA256;
+            }
+            else {
+                throw new Exception(String.format("Unsupported sign_type: %s", signTypeInData));
+            }
+        }
+        return WXPayUtil.isSignatureValid(reqData, WXPayDefaultConfig.key, signType);
+    }
+
+
+    /**
+     * 不需要证书的请求
+     * @param strUrl String
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs 超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public static String requestWithoutCert(String strUrl, Map<String, String> reqData,
+                                     int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String UTF8 = "UTF-8";
+        String reqBody = WXPayUtil.mapToXml(reqData);
+        URL httpUrl = new URL(strUrl);
+        HttpURLConnection httpURLConnection = (HttpURLConnection) httpUrl.openConnection();
+        httpURLConnection.setDoOutput(true);
+        httpURLConnection.setRequestMethod("POST");
+        httpURLConnection.setConnectTimeout(connectTimeoutMs);
+        httpURLConnection.setReadTimeout(readTimeoutMs);
+        httpURLConnection.connect();
+        OutputStream outputStream = httpURLConnection.getOutputStream();
+        outputStream.write(reqBody.getBytes(UTF8));
+
+        // if (httpURLConnection.getResponseCode()!= 200) {
+        //     throw new Exception(String.format("HTTP response code is %d, not 200", httpURLConnection.getResponseCode()));
+        // }
+
+        //获取内容
+        InputStream inputStream = httpURLConnection.getInputStream();
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, UTF8));
+        final StringBuffer stringBuffer = new StringBuffer();
+        String line = null;
+        while ((line = bufferedReader.readLine()) != null) {
+            stringBuffer.append(line).append("\n");
+        }
+        String resp = stringBuffer.toString();
+        if (stringBuffer!=null) {
+            try {
+                bufferedReader.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        if (inputStream!=null) {
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        if (outputStream!=null) {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        // if (httpURLConnection!=null) {
+        //     httpURLConnection.disconnect();
+        // }
+
+        return resp;
+    }
+
+
+    /**
+     * 需要证书的请求
+     * @param strUrl String
+     * @param reqData 向wxpay post的请求数据  Map
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs 超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public static String requestWithCert(String strUrl, Map<String, String> reqData,
+                                  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String UTF8 = "UTF-8";
+        String reqBody = WXPayUtil.mapToXml(reqData);
+        URL httpUrl = new URL(strUrl);
+        char[] password = WXPayDefaultConfig.mchId.toCharArray();
+        InputStream certStream = WXPayDefaultConfig.cerStream;
+        KeyStore ks = KeyStore.getInstance("PKCS12");
+        ks.load(certStream, password);
+
+        // 实例化密钥库 & 初始化密钥工厂
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+        kmf.init(ks, password);
+
+        // 创建SSLContext
+        SSLContext sslContext = SSLContext.getInstance("TLS");
+        sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
+        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
+
+        HttpURLConnection httpURLConnection = (HttpURLConnection) httpUrl.openConnection();
+
+        httpURLConnection.setDoOutput(true);
+        httpURLConnection.setRequestMethod("POST");
+        httpURLConnection.setConnectTimeout(connectTimeoutMs);
+        httpURLConnection.setReadTimeout(readTimeoutMs);
+        httpURLConnection.connect();
+        OutputStream outputStream = httpURLConnection.getOutputStream();
+        outputStream.write(reqBody.getBytes(UTF8));
+
+        // if (httpURLConnection.getResponseCode()!= 200) {
+        //     throw new Exception(String.format("HTTP response code is %d, not 200", httpURLConnection.getResponseCode()));
+        // }
+
+        //获取内容
+        InputStream inputStream = httpURLConnection.getInputStream();
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, UTF8));
+        final StringBuffer stringBuffer = new StringBuffer();
+        String line = null;
+        while ((line = bufferedReader.readLine()) != null) {
+            stringBuffer.append(line);
+        }
+        String resp = stringBuffer.toString();
+        if (stringBuffer!=null) {
+            try {
+                bufferedReader.close();
+            } catch (IOException e) {
+                // e.printStackTrace();
+            }
+        }
+        if (inputStream!=null) {
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                // e.printStackTrace();
+            }
+        }
+        if (outputStream!=null) {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                // e.printStackTrace();
+            }
+        }
+        if (certStream!=null) {
+            try {
+                certStream.close();
+            } catch (IOException e) {
+                // e.printStackTrace();
+            }
+        }
+        // if (httpURLConnection!=null) {
+        //     httpURLConnection.disconnect();
+        // }
+
+        return resp;
+    }
+
+    /**
+     * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
+     * @param xmlStr API返回的XML格式数据
+     * @return Map类型数据
+     * @throws Exception
+     */
+    public static Map<String, String> processResponseXml(String xmlStr) throws Exception {
+        String RETURN_CODE = "return_code";
+        String return_code;
+        Map<String, String> respData = WXPayUtil.xmlToMap(xmlStr);
+        if (respData.containsKey(RETURN_CODE)) {
+            return_code = respData.get(RETURN_CODE);
+        }
+        else {
+            throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
+        }
+
+        if (return_code.equals(WXPayConstants.FAIL)) {
+            return respData;
+        }
+        else if (return_code.equals(WXPayConstants.SUCCESS)) {
+           if (isResponseSignatureValid(respData)) {
+               return respData;
+           }
+           else {
+               throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
+           }
+        }
+        else {
+            throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
+        }
+    }
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public static Map<String, String> microPay(Map<String, String> reqData) throws Exception {
+        return microPay(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public static Map<String, String> microPay(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_MICROPAY_URL;
+        }
+        else {
+            url = WXPayConstants.MICROPAY_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:统一下单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public static Map<String, String> unifiedOrder(Map<String, String> reqData) throws Exception {
+        return unifiedOrder(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:统一下单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public static Map<String, String> unifiedOrder(Map<String, String> reqData,  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_UNIFIEDORDER_URL;
+        }
+        else {
+            url = WXPayConstants.UNIFIEDORDER_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:查询订单<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> orderQuery(Map<String, String> reqData) throws Exception {
+        return orderQuery(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:查询订单<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据 int
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> orderQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_ORDERQUERY_URL;
+        }
+        else {
+            url = WXPayConstants.ORDERQUERY_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:撤销订单<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> reverse(Map<String, String> reqData) throws Exception {
+        return reverse(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:撤销订单<br>
+     * 场景:刷卡支付<br>
+     * 其他:需要证书
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> reverse(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_REVERSE_URL;
+        }
+        else {
+            url = WXPayConstants.REVERSE_URL;
+        }
+        String respXml = requestWithCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:关闭订单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> closeOrder(Map<String, String> reqData) throws Exception {
+        return closeOrder(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:关闭订单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> closeOrder(Map<String, String> reqData,  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_CLOSEORDER_URL;
+        }
+        else {
+            url = WXPayConstants.CLOSEORDER_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:申请退款<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refund(Map<String, String> reqData) throws Exception {
+        return refund(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:申请退款<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
+     * 其他:需要证书
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refund(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_REFUND_URL;
+        }
+        else {
+            url = WXPayConstants.REFUND_URL;
+        }
+        String respXml = requestWithCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:退款查询<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refundQuery(Map<String, String> reqData) throws Exception {
+        return refundQuery(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:退款查询<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refundQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_REFUNDQUERY_URL;
+        }
+        else {
+            url = WXPayConstants.REFUNDQUERY_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:对账单下载(成功时返回对账单数据,失败时返回XML格式数据)<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> downloadBill(Map<String, String> reqData) throws Exception {
+        return downloadBill(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:对账单下载<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
+     * 其他:无论是否成功都返回Map。若成功,返回的Map中含有return_code、return_msg、data,
+     *      其中return_code为`SUCCESS`,data为对账单数据。
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return 经过封装的API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> downloadBill(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_DOWNLOADBILL_URL;
+        }
+        else {
+            url = WXPayConstants.DOWNLOADBILL_URL;
+        }
+        String respStr = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs).trim();
+        Map<String, String> ret;
+        // 出现错误,返回XML数据
+        if (respStr.indexOf("<") == 0) {
+            ret = WXPayUtil.xmlToMap(respStr);
+        }
+        else {
+            // 正常返回csv数据
+            ret = new HashMap<String, String>();
+            ret.put("return_code", WXPayConstants.SUCCESS);
+            ret.put("return_msg", "sdk");
+            ret.put("data", respStr);
+        }
+        return ret;
+    }
+
+
+    /**
+     * 作用:交易保障<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> report(Map<String, String> reqData) throws Exception {
+        return report(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:交易保障<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> report(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_REPORT_URL;
+        }
+        else {
+            url = WXPayConstants.REPORT_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return WXPayUtil.xmlToMap(respXml);
+    }
+
+
+    /**
+     * 作用:转换短链接<br>
+     * 场景:刷卡支付、扫码支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> shortUrl(Map<String, String> reqData) throws Exception {
+        return shortUrl(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:转换短链接<br>
+     * 场景:刷卡支付、扫码支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> shortUrl(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_SHORTURL_URL;
+        }
+        else {
+            url = WXPayConstants.SHORTURL_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:授权码查询OPENID接口<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> authCodeToOpenid(Map<String, String> reqData) throws Exception {
+        return authCodeToOpenid(reqData, WXPayDefaultConfig.httpConnectTimeoutMs, WXPayDefaultConfig.httpReadTimeoutMs);
+    }
+
+
+    /**
+     * 作用:授权码查询OPENID接口<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> authCodeToOpenid(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (useSandbox) {
+            url = WXPayConstants.SANDBOX_AUTHCODETOOPENID_URL;
+        }
+        else {
+            url = WXPayConstants.AUTHCODETOOPENID_URL;
+        }
+        String respXml = requestWithoutCert(url, fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return processResponseXml(respXml);
+    }
+
+
+} // end class

+ 45 - 0
src/main/java/com/fdkankan/sale/pay/wx/WXPayConstants.java

@@ -0,0 +1,45 @@
+package com.fdkankan.sale.pay.wx;
+
+/**
+ * 常量
+ */
+public class WXPayConstants {
+
+    public enum SignType {
+        MD5, HMACSHA256
+    }
+
+    public static final String FAIL     = "FAIL";
+    public static final String SUCCESS  = "SUCCESS";
+    public static final String HMACSHA256 = "HMAC-SHA256";
+    public static final String MD5 = "MD5";
+
+    public static final String FIELD_SIGN = "sign";
+    public static final String FIELD_SIGN_TYPE = "sign_type";
+
+    public static final String MICROPAY_URL     = "https://api.mch.weixin.qq.com/pay/micropay";
+    public static final String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+    public static final String ORDERQUERY_URL   = "https://api.mch.weixin.qq.com/pay/orderquery";
+    public static final String REVERSE_URL      = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
+    public static final String CLOSEORDER_URL   = "https://api.mch.weixin.qq.com/pay/closeorder";
+    public static final String REFUND_URL       = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+    public static final String REFUNDQUERY_URL  = "https://api.mch.weixin.qq.com/pay/refundquery";
+    public static final String DOWNLOADBILL_URL = "https://api.mch.weixin.qq.com/pay/downloadbill";
+    public static final String REPORT_URL       = "https://api.mch.weixin.qq.com/payitil/report";
+    public static final String SHORTURL_URL     = "https://api.mch.weixin.qq.com/tools/shorturl";
+    public static final String AUTHCODETOOPENID_URL = "https://api.mch.weixin.qq.com/tools/authcodetoopenid";
+
+    // sandbox
+    public static final String SANDBOX_MICROPAY_URL     = "https://api.mch.weixin.qq.com/sandboxnew/pay/micropay";
+    public static final String SANDBOX_UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder";
+    public static final String SANDBOX_ORDERQUERY_URL   = "https://api.mch.weixin.qq.com/sandboxnew/pay/orderquery";
+    public static final String SANDBOX_REVERSE_URL      = "https://api.mch.weixin.qq.com/sandboxnew/secapi/pay/reverse";
+    public static final String SANDBOX_CLOSEORDER_URL   = "https://api.mch.weixin.qq.com/sandboxnew/pay/closeorder";
+    public static final String SANDBOX_REFUND_URL       = "https://api.mch.weixin.qq.com/sandboxnew/secapi/pay/refund";
+    public static final String SANDBOX_REFUNDQUERY_URL  = "https://api.mch.weixin.qq.com/sandboxnew/pay/refundquery";
+    public static final String SANDBOX_DOWNLOADBILL_URL = "https://api.mch.weixin.qq.com/sandboxnew/pay/downloadbill";
+    public static final String SANDBOX_REPORT_URL       = "https://api.mch.weixin.qq.com/sandboxnew/payitil/report";
+    public static final String SANDBOX_SHORTURL_URL     = "https://api.mch.weixin.qq.com/sandboxnew/tools/shorturl";
+    public static final String SANDBOX_AUTHCODETOOPENID_URL = "https://api.mch.weixin.qq.com/sandboxnew/tools/authcodetoopenid";
+
+}

+ 11 - 2
src/main/java/com/fdkankan/sale/pay/wx/WXPayDefaultConfig.java

@@ -1,14 +1,23 @@
 package com.fdkankan.sale.pay.wx;
 package com.fdkankan.sale.pay.wx;
 
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
 public class WXPayDefaultConfig  {
 public class WXPayDefaultConfig  {
 
 
-    public static String appId = "wx779dbafb46bab697";
+    public static String appId = "wxac3d59ea82d9b82a";
     public static String mchId = "1627275258";
     public static String mchId = "1627275258";
     public static String key = "4DAGE1684DAGE1684DAGE1684DAGE168";
     public static String key = "4DAGE1684DAGE1684DAGE1684DAGE168";
-    public static String secret = "306d0d03b372232e03dca1107525f4fc";
+    public static String secret = "6781e1dce2799403662d3050c728a3e9";
     public static String createIp = "47.104.99.106";
     public static String createIp = "47.104.99.106";
     public static String serialNo = "214540155950926";
     public static String serialNo = "214540155950926";
 
 
+    public static String h5RedirectURL = "mobile.html#/check";
+
+    public static String notifyURL = "service/sale/order/pay/wechatPay/notify";
+    public static InputStream cerStream;
+    public static Integer httpConnectTimeoutMs = 8000;
+    public static Integer httpReadTimeoutMs = 10000;
 
 
 
 
 }
 }

+ 278 - 0
src/main/java/com/fdkankan/sale/pay/wx/WXPayUtil.java

@@ -0,0 +1,278 @@
+package com.fdkankan.sale.pay.wx;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.security.MessageDigest;
+import java.util.*;
+
+
+public class WXPayUtil {
+
+    /**
+     * XML格式字符串转换为Map
+     *
+     * @param strXML XML字符串
+     * @return XML数据转换后的Map
+     * @throws Exception
+     */
+    public static Map<String, String> xmlToMap(String strXML) throws Exception {
+        Map<String, String> data = new HashMap<String, String>();
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+
+        // 禁用XML外部实体注入
+        /**
+         * XXE
+         * XML 外部实体注入漏洞(XML External Entity Injection,简称 XXE),
+         * 是一种容易被忽视,但危害巨大的漏洞。它可以利用 XML 外部实体加载注入,
+         * 执行不可预控的代码,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
+         */
+
+        /**
+         * 原理:
+         * 通常,我们在使用微信支付时,商家会有一个通知的 URL 来接收异步支付结果。
+         * 然而,微信在 JAVA 版本的 SDK 存在一个 XXE 漏洞来处理这个结果。
+         * 由此攻击者可以向通知的 URL 中构建恶意的回调数据,以便根据需要窃取商家服务器上的任意信息。
+         * 一旦攻击者获得商家的关键安全密钥(md5-key 和merchant-Id),
+         * 那么他们可以通过发送伪造的信息来欺骗商家而无需付费购买任意商品。
+         */
+        documentBuilderFactory.setExpandEntityReferences(false);
+        documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
+        org.w3c.dom.Document doc = documentBuilder.parse(stream);
+        doc.getDocumentElement().normalize();
+        NodeList nodeList = doc.getDocumentElement().getChildNodes();
+        for (int idx=0; idx<nodeList.getLength(); ++idx) {
+            Node node = nodeList.item(idx);
+            if (node.getNodeType() == Node.ELEMENT_NODE) {
+                org.w3c.dom.Element element = (org.w3c.dom.Element) node;
+                data.put(element.getNodeName(), element.getTextContent());
+            }
+        }
+        try {
+            stream.close();
+        }
+        catch (Exception ex) {
+
+        }
+        return data;
+    }
+
+    /**
+     * 将Map转换为XML格式的字符串
+     *
+     * @param data Map类型数据
+     * @return XML格式的字符串
+     * @throws Exception
+     */
+    public static String mapToXml(Map<String, String> data) throws Exception {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        org.w3c.dom.Document document = documentBuilder.newDocument();
+        org.w3c.dom.Element root = document.createElement("xml");
+        document.appendChild(root);
+        for (String key: data.keySet()) {
+            String value = data.get(key);
+            if (value == null) {
+                value = "";
+            }
+            value = value.trim();
+            org.w3c.dom.Element filed = document.createElement(key);
+            filed.appendChild(document.createTextNode(value));
+            root.appendChild(filed);
+        }
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer transformer = tf.newTransformer();
+        DOMSource source = new DOMSource(document);
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        StringWriter writer = new StringWriter();
+        StreamResult result = new StreamResult(writer);
+        transformer.transform(source, result);
+        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+        try {
+            writer.close();
+        }
+        catch (Exception ex) {
+        }
+        return output;
+    }
+
+
+    /**
+     * 生成带有 sign 的 XML 格式字符串
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @return 含有sign字段的XML
+     */
+    public static String generateSignedXml(final Map<String, String> data, String key) throws Exception {
+        return generateSignedXml(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 生成带有 sign 的 XML 格式字符串
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @param signType 签名类型
+     * @return 含有sign字段的XML
+     */
+    public static String generateSignedXml(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        String sign = generateSignature(data, key, signType);
+        data.put(WXPayConstants.FIELD_SIGN, sign);
+        return mapToXml(data);
+    }
+
+
+    /**
+     * 判断签名是否正确
+     *
+     * @param xmlStr XML格式数据
+     * @param key API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(String xmlStr, String key) throws Exception {
+        Map<String, String> data = xmlToMap(xmlStr);
+        if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {
+            return false;
+        }
+        String sign = data.get(WXPayConstants.FIELD_SIGN);
+        return generateSignature(data, key).equals(sign);
+    }
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(Map<String, String> data, String key) throws Exception {
+        return isSignatureValid(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false。
+     *
+     * @param data Map类型数据
+     * @param key API密钥
+     * @param signType 签名方式
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean isSignatureValid(Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {
+            return false;
+        }
+        String sign = data.get(WXPayConstants.FIELD_SIGN);
+        return generateSignature(data, key, signType).equals(sign);
+    }
+
+    /**
+     * 生成签名
+     *
+     * @param data 待签名数据
+     * @param key API密钥
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, String> data, String key) throws Exception {
+        return generateSignature(data, key, WXPayConstants.SignType.MD5);
+    }
+
+    /**
+     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
+     *
+     * @param data 待签名数据
+     * @param key API密钥
+     * @param signType 签名方式
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
+        Set<String> keySet = data.keySet();
+        String[] keyArray = keySet.toArray(new String[keySet.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keyArray) {
+            if (k.equals(WXPayConstants.FIELD_SIGN)) {
+                continue;
+            }
+            if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
+                sb.append(k).append("=").append(data.get(k).trim()).append("&");
+        }
+        sb.append("key=").append(key);
+        if (WXPayConstants.SignType.MD5.equals(signType)) {
+            return MD5(sb.toString()).toUpperCase();
+        }
+        else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) {
+            return HMACSHA256(sb.toString(), key);
+        }
+        else {
+            throw new Exception(String.format("Invalid sign_type: %s", signType));
+        }
+    }
+
+
+    /**
+     * 获取随机字符串 Nonce Str
+     *
+     * @return String 随机字符串
+     */
+    public static String generateNonceStr() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+
+    /**
+     * 生成 MD5
+     *
+     * @param data 待处理数据
+     * @return MD5结果
+     */
+    public static String MD5(String data) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] array = md.digest(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString().toUpperCase();
+    }
+
+    /**
+     * 生成 HMACSHA256
+     * @param data 待处理数据
+     * @param key 密钥
+     * @return 加密结果
+     * @throws Exception
+     */
+    public static String HMACSHA256(String data, String key) throws Exception {
+        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
+        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
+        sha256_HMAC.init(secret_key);
+        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString().toUpperCase();
+    }
+
+}

+ 3 - 0
src/main/java/com/fdkankan/sale/pay/wx/WXUtil.java

@@ -12,6 +12,9 @@ import java.util.Random;
 
 
 public class WXUtil {
 public class WXUtil {
 
 
+   public static String getCodeUriFmt = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
+            "appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
+
     public static String schema = "WECHATPAY2-SHA256-RSA2048";
     public static String schema = "WECHATPAY2-SHA256-RSA2048";
 
 
     // Authorization: <schema> <token>
     // Authorization: <schema> <token>

+ 171 - 0
src/main/java/com/fdkankan/sale/pay/wx/WechatPayService.java

@@ -0,0 +1,171 @@
+package com.fdkankan.sale.pay.wx;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.common.util.MD5;
+import com.fdkankan.sale.common.CacheUtil;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.PriceList;
+import com.fdkankan.sale.entity.Repair;
+import com.fdkankan.sale.entity.RepairPay;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.IPriceListService;
+import com.fdkankan.sale.service.IRepairLogService;
+import com.fdkankan.sale.service.IRepairPayService;
+import com.fdkankan.sale.service.IRepairService;
+import com.fdkankan.sale.util.DateUtil;
+import com.fdkankan.sale.vo.request.WechatMobileParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+@Service
+@Slf4j
+public class WechatPayService {
+
+    @Autowired
+    IPriceListService priceListService;
+    @Autowired
+    IRepairPayService repairPayService;
+    @Autowired
+    IRepairService repairService;
+    @Autowired
+    IRepairLogService repairLogService;
+
+    public Object wechatMobilePay(WechatMobileParam param, String ip) throws Exception {
+        if(StringUtils.isBlank(param.getRepairId())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        Repair repair = repairService.getById(param.getRepairId());
+        if(repair == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        if(repair.getStatus() != 9){
+            throw new BusinessException(ResultCode.REPAIR_STATUS_NOT_EXITS);
+        }
+        RepairPay repairPay = repairPayService.getByRepairId(param.getRepairId(),1);
+        if(repairPay != null  ){
+            throw new BusinessException(ResultCode.ORDER_PAY_ERROR);
+        }
+        String orderSn = "sale_"+DateUtil.getDate();
+
+        repairPay = new RepairPay();
+        repairPay.setRepairId(param.getRepairId());
+        repairPay.setPayType(1);
+        repairPay.setOrderSn(orderSn);
+        repairPayService.save(repairPay);
+
+        BigDecimal amount = priceListService.getAmountByRepairId(param.getRepairId());
+        String subject = "维修订单";
+        BigDecimal totalFee = amount.multiply(new BigDecimal(100));
+        String body = subject;
+        return this.wechatH5Pay(param.getRepairId(),orderSn, subject, body, totalFee, ip);
+    }
+
+    public JSONObject wechatH5Pay(String repairId,String orderSn, String subject, String body, BigDecimal totalFee, String ipAddress) throws Exception {
+        log.warn("ipAddress:"+ipAddress);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("body", subject);
+        data.put("detail", body);
+        data.put("out_trade_no", orderSn);
+        data.put("device_info", "H5");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", totalFee.stripTrailingZeros().toPlainString());
+        data.put("spbill_create_ip", ipAddress);
+        data.put("notify_url", CacheUtil.mainUrl + WXPayDefaultConfig.notifyURL);
+        data.put("trade_type", "MWEB");  // 此处指定为扫码支付
+        data.put("product_id", repairId); //多个商品,使用订单号
+        data.put("nonce_str", MD5.getMessageDigest(String.valueOf(new Random().nextInt(10000)).getBytes()));
+
+        String mweb_url = "";
+        Map<String, String> resp = WXPay.unifiedOrder(data);
+        log.warn("wechatH5Pay" + resp);
+        String return_code = resp.get("return_code");
+        String return_msg = resp.get("return_msg");
+        if ("SUCCESS".equals(return_code) && "OK".equals(return_msg)) {
+            mweb_url = resp.get("mweb_url");//调微信支付接口地址
+            mweb_url += "&redirect_url=" + URLEncoder.encode(CacheUtil.mainUrl + WXPayDefaultConfig.h5RedirectURL, "UTF-8");
+            log.warn("mweb_url=" + mweb_url);
+        } else {
+            log.error("微信统一支付接口获取预支付订单出错");
+        }
+        JSONObject j = new JSONObject();
+        j.put("mweb_url", mweb_url);
+        j.put("orderSn", orderSn);
+        return j;
+    }
+
+
+    public void callBack(HttpServletRequest request, HttpServletResponse response) {
+        log.warn("微信回调接口方法 start");
+        String inputLine = "";
+        String notifyXml = "";
+        try {
+            while((inputLine = request.getReader().readLine()) != null){
+                notifyXml += inputLine;
+            }
+            //关闭流
+            request.getReader().close();
+            log.warn("微信回调内容信息:"+notifyXml);
+            //解析成Map
+            Map<String,String> map = WXPayUtil.xmlToMap(notifyXml);
+
+            if (WXPayUtil.isSignatureValid(map, WXPayDefaultConfig.key, WXPayConstants.SignType.MD5) || WXPayUtil.isSignatureValid(map, WXPayDefaultConfig.key, WXPayConstants.SignType.HMACSHA256)) {
+                //判断 支付是否成功
+                if("SUCCESS".equals(map.get("result_code"))){
+                    log.warn("微信回调返回是否支付成功:是");
+                    //获得 返回的商户订单号
+                    String out_trade_no = map.get("out_trade_no");
+                    String trade_no = map.get("transaction_id");
+                    String openid = map.get("openid");
+                    log.warn("微信回调返回商户订单号:" + out_trade_no);
+                    //修改订单状态
+                    repairService.paySuccess(out_trade_no,trade_no,openid);
+
+                    log.warn("微信支付成功,订单号:"  + out_trade_no);
+                    //通知微信服务器已经支付成功
+                    notifyXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code>"
+                            + "<return_msg><![CDATA[OK]]></return_msg></xml> ";
+                }else{
+                    notifyXml = "<xml><return_code><![CDATA[FAIL]]></return_code>"
+                            + "<return_msg><![CDATA[报文为空]]></return_msg></xml> ";
+                }
+            } else{
+                log.error("签名验证错误");
+                notifyXml = "<xml><return_code><![CDATA[FAIL]]></return_code>"
+                        + "<return_msg><![CDATA[签名验证错误]]></return_msg></xml>";
+            }
+            BufferedOutputStream out = new BufferedOutputStream(
+                    response.getOutputStream());
+            out.write(notifyXml.getBytes());
+            out.flush();
+            out.close();
+
+        } catch (Exception e) {
+            log.error("微信支付回调数据异常, errorMsg:{}", e.getMessage());
+        }
+    }
+
+
+    public Object queryStatus(WechatMobileParam param) {
+        if(StringUtils.isBlank(param.getOrderSn())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        RepairPay repairPay = repairPayService.getByOrderSn(param.getOrderSn());
+        if(repairPay == null){
+            throw new BusinessException(ResultCode.ORDER_PAY_NOT_EXITS);
+        }
+        return repairPay.getPayStatus();
+    }
+}

+ 16 - 0
src/main/java/com/fdkankan/sale/service/ICameraDetailService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.CameraDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 相机子表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+public interface ICameraDetailService extends IService<CameraDetail> {
+
+}

+ 19 - 0
src/main/java/com/fdkankan/sale/service/ICameraService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.Camera;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 相机主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+public interface ICameraService extends IService<Camera> {
+
+    Camera getBySnCode(String cameraSnCode);
+
+    Integer getCameraTypeByCameraId(Long cameraId);
+}

+ 19 - 0
src/main/java/com/fdkankan/sale/service/ICustomerAddressService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.CustomerAddress;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+public interface ICustomerAddressService extends IService<CustomerAddress> {
+
+    void setTrackingNumByRepairId(String repairId, String sendTrackingNum);
+
+    CustomerAddress getByRepairId(String repairId);
+}

+ 21 - 0
src/main/java/com/fdkankan/sale/service/ICustomerService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.Customer;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+public interface ICustomerService extends IService<Customer> {
+
+    Customer getByRepairId(String repairId);
+
+    List<Customer> getByOpenId(String openId);
+}

+ 16 - 0
src/main/java/com/fdkankan/sale/service/ILaborCostService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.LaborCost;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+public interface ILaborCostService extends IService<LaborCost> {
+
+}

+ 22 - 0
src/main/java/com/fdkankan/sale/service/IOrderReceivingService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.OrderReceiving;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.response.OrderReceivingVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+public interface IOrderReceivingService extends IService<OrderReceiving> {
+
+    OrderReceiving getByRepairId(String repairId);
+
+    OrderReceivingVo getVoByRepairId(String repairId);
+}

+ 1 - 1
src/main/java/com/fdkankan/sale/service/IPartLogService.java

@@ -16,7 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
  */
 public interface IPartLogService extends IService<PartLog> {
 public interface IPartLogService extends IService<PartLog> {
 
 
-    void saveByInStock(Part part, Long userId,String nickName);
+    void saveLog(Integer partId,Integer count, Long userId,Integer status,String repairId);
 
 
     PageInfo pageList(RequestBase param);
     PageInfo pageList(RequestBase param);
 }
 }

+ 8 - 1
src/main/java/com/fdkankan/sale/service/IPartService.java

@@ -3,6 +3,9 @@ package com.fdkankan.sale.service;
 import com.fdkankan.sale.entity.Part;
 import com.fdkankan.sale.entity.Part;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.sale.vo.request.PartParam;
 import com.fdkankan.sale.vo.request.PartParam;
+import com.fdkankan.sale.vo.response.RepairRegisterPartVo;
+
+import java.util.List;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -18,5 +21,9 @@ public interface IPartService extends IService<Part> {
 
 
     Object allList(PartParam param);
     Object allList(PartParam param);
 
 
-    void inStock(Part part,Long userId,String nickName);
+    void inStock(Part part,Long userId);
+
+    void outStock(Integer partId,Integer count,Long userId,String repairId);
+
+    void recovery(Integer partId, Integer partCount, Long userId, String repairId);
 }
 }

+ 22 - 0
src/main/java/com/fdkankan/sale/service/IPriceListService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.PriceList;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+public interface IPriceListService extends IService<PriceList> {
+
+    List<PriceList> getByRepairId(String repairId);
+
+    BigDecimal getAmountByRepairId(String repairId);
+}

+ 17 - 0
src/main/java/com/fdkankan/sale/service/IRepairCommentService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairComment;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+public interface IRepairCommentService extends IService<RepairComment> {
+
+    RepairComment getByRepairId(String repaiManId);
+}

+ 20 - 0
src/main/java/com/fdkankan/sale/service/IRepairInvoiceService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairInvoice;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.request.RepairInvoiceParam;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+public interface IRepairInvoiceService extends IService<RepairInvoice> {
+
+    RepairInvoice getByRepairId(String repairId);
+
+    Object pageList(RepairInvoiceParam param);
+}

+ 26 - 0
src/main/java/com/fdkankan/sale/service/IRepairLogService.java

@@ -0,0 +1,26 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.response.RepairLogVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+public interface IRepairLogService extends IService<RepairLog> {
+
+    void saveBySysUser(Long sysUserId, String repairId,Integer repairStatus,String remark);
+
+    RepairLog getByRepairIdAndStatus(String repairId, Integer status);
+
+    List<RepairLog> getByRepairId(String repairId);
+
+    List<RepairLogVo> getVoByRepairId(String repairId);
+}

+ 21 - 0
src/main/java/com/fdkankan/sale/service/IRepairPayService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairPay;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+public interface IRepairPayService extends IService<RepairPay> {
+
+    RepairPay getByRepairId(String repairId,Integer payStatus);
+
+    RepairPay getByOrderSn(String out_trade_no);
+
+    void updatePayStatus(String out_trade_no, String trade_no, String openid);
+}

+ 23 - 0
src/main/java/com/fdkankan/sale/service/IRepairRegisterPartService.java

@@ -0,0 +1,23 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairRegisterPart;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+public interface IRepairRegisterPartService extends IService<RepairRegisterPart> {
+
+    List<RepairRegisterPart> getByRepairId(String repairId);
+
+    void updateStatus(String repairId,Integer status);
+
+    void updateRecoveryStatus(String repairId, Integer status);
+}

+ 25 - 0
src/main/java/com/fdkankan/sale/service/IRepairRegisterService.java

@@ -0,0 +1,25 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairRegister;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.response.CheckRegisterVo;
+import com.fdkankan.sale.vo.response.RepairRegisterVo;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+public interface IRepairRegisterService extends IService<RepairRegister> {
+
+    void repairOver(String repairId, String remark);
+
+    RepairRegister getByRepairId(String repairId);
+
+    CheckRegisterVo getCheckVoByRepairId(String repairId);
+
+    RepairRegisterVo getVoByRepairId(String repairId);
+}

+ 42 - 0
src/main/java/com/fdkankan/sale/service/IRepairService.java

@@ -0,0 +1,42 @@
+package com.fdkankan.sale.service;
+
+import cn.hutool.db.sql.Order;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.entity.OrderReceiving;
+import com.fdkankan.sale.entity.Repair;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.request.CheckRegisterParam;
+import com.fdkankan.sale.vo.request.OrderReceivingParam;
+import com.fdkankan.sale.vo.request.RecordingParam;
+import com.fdkankan.sale.vo.request.RepairParam;
+import com.fdkankan.sale.vo.response.RepairerVo;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-12
+ */
+public interface IRepairService extends IService<Repair> {
+
+    void updateRepairStatus(String repairId, Integer status);
+
+    Page<RepairerVo> supplyOrderList( RepairParam param);
+
+    Page<RepairerVo> repairerOrderList(RepairParam param);
+
+    RepairerVo getByRepairId(String repairId);
+
+    Page<RepairerVo> testOrderList(RepairParam param);
+
+    Page<RepairerVo> saleOrderList(RepairParam param);
+
+    void paySuccess(String orderSn, String tradeNo, String openid);
+
+    void updateCommentStatus(String repairId);
+
+    void updateInvoiceStatus(String repairId);
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/service/IRepairTestService.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.RepairTest;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.response.RepairTestVo;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-20
+ */
+public interface IRepairTestService extends IService<RepairTest> {
+
+    RepairTestVo getVoByRepairId(String repairId);
+}

+ 2 - 0
src/main/java/com/fdkankan/sale/service/ISysRoleService.java

@@ -23,4 +23,6 @@ public interface ISysRoleService extends IService<SysRole> {
     void delete(Long id);
     void delete(Long id);
 
 
     void giveMenu(SysRoleMenuParam param);
     void giveMenu(SysRoleMenuParam param);
+
+    SysRole getByRoleType(Integer roleType);
 }
 }

+ 2 - 0
src/main/java/com/fdkankan/sale/service/ISysUserService.java

@@ -32,4 +32,6 @@ public interface ISysUserService extends IService<SysUser> {
     HashMap<Long, SysUser> getByIds(Set<Long> sysUserIds);
     HashMap<Long, SysUser> getByIds(Set<Long> sysUserIds);
 
 
     void saveByRedisKey(String redisKey);
     void saveByRedisKey(String redisKey);
+
+    SysUser getByManageId(Long userId);
 }
 }

+ 22 - 0
src/main/java/com/fdkankan/sale/service/impl/CameraDetailServiceImpl.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.fdkankan.sale.entity.CameraDetail;
+import com.fdkankan.sale.mapper.ICameraDetailMapper;
+import com.fdkankan.sale.service.ICameraDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 相机子表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+@Service
+@DS("db2")
+public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, CameraDetail> implements ICameraDetailService {
+
+}

+ 57 - 0
src/main/java/com/fdkankan/sale/service/impl/CameraServiceImpl.java

@@ -0,0 +1,57 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.Camera;
+import com.fdkankan.sale.entity.CameraDetail;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.mapper.ICameraDetailMapper;
+import com.fdkankan.sale.mapper.ICameraMapper;
+import com.fdkankan.sale.service.ICameraDetailService;
+import com.fdkankan.sale.service.ICameraService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-15
+ */
+@Service
+@DS("db2")
+public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implements ICameraService {
+
+    @Autowired
+    ICameraDetailService cameraDetailService;
+
+    @Override
+    public Camera getBySnCode(String cameraSnCode) {
+        LambdaQueryWrapper<Camera> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Camera::getSnCode,cameraSnCode);
+        return  this.getOne(wrapper);
+    }
+
+    @Override
+    public Integer getCameraTypeByCameraId(Long cameraId) {
+        LambdaQueryWrapper<CameraDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CameraDetail::getCameraId,cameraId);
+        CameraDetail cameraDetail = cameraDetailService.getOne(wrapper);
+        if(cameraDetail == null){
+            throw new BusinessException(ResultCode.CAMERA_DETAIL_NOT_EXITS);
+        }
+        Integer cameraType = null;
+        switch (cameraDetail.getType()){
+            case 9: cameraType = 1;break;
+            case 10: cameraType = 2;break;
+            default: cameraType = 0; break;
+        }
+        return cameraType;
+    }
+}

+ 36 - 0
src/main/java/com/fdkankan/sale/service/impl/CustomerAddressServiceImpl.java

@@ -0,0 +1,36 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.sale.entity.CustomerAddress;
+import com.fdkankan.sale.mapper.ICustomerAddressMapper;
+import com.fdkankan.sale.service.ICustomerAddressService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+@Service
+public class CustomerAddressServiceImpl extends ServiceImpl<ICustomerAddressMapper, CustomerAddress> implements ICustomerAddressService {
+
+    @Override
+    public void setTrackingNumByRepairId(String repairId, String sendTrackingNum) {
+        LambdaUpdateWrapper<CustomerAddress> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(CustomerAddress::getRepairId,repairId);
+        wrapper.set(CustomerAddress::getGetTrackingNum,sendTrackingNum);
+        this.update(wrapper);
+    }
+
+    @Override
+    public CustomerAddress getByRepairId(String repairId) {
+        LambdaQueryWrapper<CustomerAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CustomerAddress::getRepairId,repairId);
+        return this.getOne(wrapper);
+    }
+}

+ 36 - 0
src/main/java/com/fdkankan/sale/service/impl/CustomerServiceImpl.java

@@ -0,0 +1,36 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.entity.Customer;
+import com.fdkankan.sale.mapper.ICustomerMapper;
+import com.fdkankan.sale.service.ICustomerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-10
+ */
+@Service
+public class CustomerServiceImpl extends ServiceImpl<ICustomerMapper, Customer> implements ICustomerService {
+
+    @Override
+    public Customer getByRepairId(String repairId) {
+        LambdaQueryWrapper<Customer> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Customer::getRepairId,repairId);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public List<Customer> getByOpenId(String openId) {
+        LambdaQueryWrapper<Customer> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Customer::getWxOpenId,openId);
+        return this.list(wrapper);
+    }
+}

+ 20 - 0
src/main/java/com/fdkankan/sale/service/impl/LaborCostServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.sale.service.impl;
+
+import com.fdkankan.sale.entity.LaborCost;
+import com.fdkankan.sale.mapper.ILaborCostMapper;
+import com.fdkankan.sale.service.ILaborCostService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Service
+public class LaborCostServiceImpl extends ServiceImpl<ILaborCostMapper, LaborCost> implements ILaborCostService {
+
+}

+ 36 - 0
src/main/java/com/fdkankan/sale/service/impl/OrderReceivingServiceImpl.java

@@ -0,0 +1,36 @@
+package com.fdkankan.sale.service.impl;
+import java.util.Date;
+import java.util.List;
+import java.util.WeakHashMap;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.entity.OrderReceiving;
+import com.fdkankan.sale.mapper.IOrderReceivingMapper;
+import com.fdkankan.sale.service.IOrderReceivingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.vo.response.OrderReceivingVo;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-13
+ */
+@Service
+public class OrderReceivingServiceImpl extends ServiceImpl<IOrderReceivingMapper, OrderReceiving> implements IOrderReceivingService {
+
+    @Override
+    public OrderReceiving getByRepairId(String repairId) {
+        LambdaQueryWrapper<OrderReceiving> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(OrderReceiving::getRepairId,repairId);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public OrderReceivingVo getVoByRepairId(String repairId) {
+        return this.getBaseMapper().getVoByRepairId(repairId);
+    }
+}

+ 17 - 7
src/main/java/com/fdkankan/sale/service/impl/PartLogServiceImpl.java

@@ -4,11 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.sale.common.PageInfo;
 import com.fdkankan.sale.common.PageInfo;
 import com.fdkankan.sale.common.RequestBase;
 import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.common.ResultCode;
 import com.fdkankan.sale.entity.Part;
 import com.fdkankan.sale.entity.Part;
 import com.fdkankan.sale.entity.PartLog;
 import com.fdkankan.sale.entity.PartLog;
+import com.fdkankan.sale.exception.BusinessException;
 import com.fdkankan.sale.mapper.IPartLogMapper;
 import com.fdkankan.sale.mapper.IPartLogMapper;
 import com.fdkankan.sale.service.IPartLogService;
 import com.fdkankan.sale.service.IPartLogService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.service.IPartService;
+import com.fdkankan.sale.vo.response.PartLogVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 /**
 /**
@@ -22,23 +27,28 @@ import org.springframework.stereotype.Service;
 @Service
 @Service
 public class PartLogServiceImpl extends ServiceImpl<IPartLogMapper, PartLog> implements IPartLogService {
 public class PartLogServiceImpl extends ServiceImpl<IPartLogMapper, PartLog> implements IPartLogService {
 
 
+    @Autowired
+    IPartService partService;
+
     @Override
     @Override
-    public void saveByInStock(Part part, Long userId,String nickName) {
+    public void saveLog(Integer partId,Integer count, Long userId,Integer status,String repairId) {
+        Part part = partService.getById(partId);
+        if(part == null){
+            throw new BusinessException(ResultCode.PART_NOT_EXITS);
+        }
         PartLog partLog = new PartLog();
         PartLog partLog = new PartLog();
-        partLog.setCameraType(part.getCameraType());
         partLog.setPartId(part.getPartId());
         partLog.setPartId(part.getPartId());
         partLog.setPartName(part.getPartName());
         partLog.setPartName(part.getPartName());
-        partLog.setInCount(part.getPartStock());
+        partLog.setStatus(status);
+        partLog.setCount(count);
         partLog.setSysUserId(userId);
         partLog.setSysUserId(userId);
-        partLog.setSysUserName(nickName);
+        partLog.setRepairId(repairId);
         this.save(partLog);
         this.save(partLog);
     }
     }
 
 
     @Override
     @Override
     public PageInfo pageList(RequestBase param) {
     public PageInfo pageList(RequestBase param) {
-        LambdaQueryWrapper<PartLog> wrapper = new LambdaQueryWrapper<>();
-        wrapper.orderByDesc(PartLog::getCreateTime);
-        Page<PartLog> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        Page<PartLogVo> page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(), param.getPageSize()),0);
         return PageInfo.PageInfo(page);
         return PageInfo.PageInfo(page);
     }
     }
 }
 }

+ 27 - 5
src/main/java/com/fdkankan/sale/service/impl/PartServiceImpl.java

@@ -6,16 +6,23 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.sale.common.PageInfo;
 import com.fdkankan.sale.common.PageInfo;
 import com.fdkankan.sale.common.ResultCode;
 import com.fdkankan.sale.common.ResultCode;
 import com.fdkankan.sale.entity.Part;
 import com.fdkankan.sale.entity.Part;
+import com.fdkankan.sale.entity.PartLog;
+import com.fdkankan.sale.entity.Repair;
 import com.fdkankan.sale.exception.BusinessException;
 import com.fdkankan.sale.exception.BusinessException;
 import com.fdkankan.sale.mapper.IPartMapper;
 import com.fdkankan.sale.mapper.IPartMapper;
 import com.fdkankan.sale.service.IPartLogService;
 import com.fdkankan.sale.service.IPartLogService;
 import com.fdkankan.sale.service.IPartService;
 import com.fdkankan.sale.service.IPartService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.sale.vo.request.PartParam;
 import com.fdkankan.sale.vo.request.PartParam;
+import com.fdkankan.sale.vo.response.RepairRegisterPartVo;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  *  服务实现类
  *  服务实现类
@@ -30,12 +37,10 @@ public class PartServiceImpl extends ServiceImpl<IPartMapper, Part> implements I
     @Autowired
     @Autowired
     IPartLogService partLogService;
     IPartLogService partLogService;
 
 
-
     @Override
     @Override
     public Object pageList(PartParam param) {
     public Object pageList(PartParam param) {
         LambdaQueryWrapper<Part> wrapper = getWrapper(param);
         LambdaQueryWrapper<Part> wrapper = getWrapper(param);
         Page<Part> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
         Page<Part> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
-
         return PageInfo.PageInfo(page);
         return PageInfo.PageInfo(page);
     }
     }
 
 
@@ -45,6 +50,8 @@ public class PartServiceImpl extends ServiceImpl<IPartMapper, Part> implements I
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
         }
         LambdaQueryWrapper<Part> wrapper = getWrapper(param);
         LambdaQueryWrapper<Part> wrapper = getWrapper(param);
+        wrapper.eq(Part::getCameraType,0);
+        wrapper.eq(Part::getStatus,0);
         return this.list(wrapper);
         return this.list(wrapper);
     }
     }
 
 
@@ -61,15 +68,30 @@ public class PartServiceImpl extends ServiceImpl<IPartMapper, Part> implements I
     }
     }
 
 
     @Override
     @Override
-    public void inStock(Part part,Long userId,String nickName) {
+    public void inStock(Part part,Long userId) {
         if(part.getPartId() == null || part.getPartStock() == null){
         if(part.getPartId() == null || part.getPartStock() == null){
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
             throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
         }
         }
         LambdaUpdateWrapper<Part> wrapper = new LambdaUpdateWrapper<>();
         LambdaUpdateWrapper<Part> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(Part::getPartId,part.getPartId());
         wrapper.eq(Part::getPartId,part.getPartId());
-        wrapper.set(Part::getPartStock,part.getPartStock());
+        wrapper.setSql("part_stock = part_stock +" + part.getPartStock());
+        this.update(wrapper);
+        partLogService.saveLog(part.getPartId(),part.getPartStock(),userId,0,null);
+    }
+
+    @Override
+    public void outStock(Integer partId, Integer count,Long userId,String repairId) {
+        LambdaUpdateWrapper<Part> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(Part::getPartId,partId);
+        wrapper.setSql("part_stock = part_stock -" + count);
         this.update(wrapper);
         this.update(wrapper);
-        partLogService.saveByInStock(part,userId,nickName);
+        partLogService.saveLog(partId,count,userId,1,repairId);
+
+    }
+
+    @Override
+    public void recovery(Integer partId, Integer partCount, Long userId, String repairId) {
+        partLogService.saveLog(partId,partCount,userId,2,repairId);
 
 
     }
     }
 }
 }

+ 40 - 0
src/main/java/com/fdkankan/sale/service/impl/PriceListServiceImpl.java

@@ -0,0 +1,40 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.entity.PriceList;
+import com.fdkankan.sale.mapper.IPriceListMapper;
+import com.fdkankan.sale.service.IPriceListService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-16
+ */
+@Service
+public class PriceListServiceImpl extends ServiceImpl<IPriceListMapper, PriceList> implements IPriceListService {
+
+    @Override
+    public List<PriceList> getByRepairId(String repairId) {
+        LambdaQueryWrapper<PriceList> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PriceList::getRepairId,repairId);
+        return list(wrapper);
+    }
+
+    @Override
+    public BigDecimal getAmountByRepairId(String repairId) {
+        BigDecimal amount = BigDecimal.ZERO;
+        List<PriceList> byRepairId = this.getByRepairId(repairId);
+        for (PriceList priceList : byRepairId) {
+            amount = amount.add(priceList.getPrice().multiply(new BigDecimal(priceList.getCount())));
+        }
+        return amount;
+    }
+}

+ 27 - 0
src/main/java/com/fdkankan/sale/service/impl/RepairCommentServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.entity.RepairComment;
+import com.fdkankan.sale.mapper.IRepairCommentMapper;
+import com.fdkankan.sale.service.IRepairCommentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-02-22
+ */
+@Service
+public class RepairCommentServiceImpl extends ServiceImpl<IRepairCommentMapper, RepairComment> implements IRepairCommentService {
+
+    @Override
+    public RepairComment getByRepairId(String repaiManId) {
+        LambdaQueryWrapper<RepairComment> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(RepairComment::getRepairId,repaiManId);
+        return this.getOne(wrapper);
+    }
+}

+ 102 - 0
src/main/java/com/fdkankan/sale/service/impl/RepairCustomerService.java

@@ -0,0 +1,102 @@
+package com.fdkankan.sale.service.impl;
+
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.*;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.*;
+import com.fdkankan.sale.vo.request.RepairParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class RepairCustomerService {
+
+    @Autowired
+    ICustomerService customerService;
+    @Autowired
+    IRepairService repairService;
+    @Autowired
+    IRepairLogService repairLogService;
+    @Autowired
+    IRepairCommentService repairCommentService;
+    @Autowired
+    IRepairInvoiceService repairInvoiceService;
+    @Autowired
+    IRepairPayService repairPayService;
+
+    public Object getRepairByOpenId(String openId) {
+        List<Customer> list = customerService.getByOpenId(openId);
+        if(list!= null && list.size() >0){
+            List<String> repairIds = list.stream().map(Customer::getRepairId).collect(Collectors.toList());
+            return repairService.listByIds(repairIds);
+        }
+        return null;
+    }
+
+    /**
+     *      * status 0待接单,1待检测,2待报价,3待确认,4已取消,5待备料,6待回收,7维修中,8待测试,
+     *      *        9待支付(已完结),10待收货,11已发货,12已评价
+     */
+    public void confirmRepair(RepairParam param) {
+        if(StringUtils.isBlank(param.getRepairId()) ){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        Repair repair = repairService.getById(param.getRepairId());
+        if(repair == null){
+            throw new BusinessException(ResultCode.ORDER_PAY_NOT_EXITS);
+        }
+        Integer repairStatus = 5;
+        String remark = "确认维修";
+        if(param.getConfirm() == 1 ){
+            repairStatus = 4;
+            remark = "取消维修";
+        }
+        repairLogService.saveBySysUser(null,repair.getRepairId(),repairStatus,remark);
+    }
+
+    public void comment(RepairParam param) {
+        if(StringUtils.isBlank(param.getRepairId()) ){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        RepairComment repairComment = repairCommentService.getByRepairId(param.getRepairId());
+        if(repairComment !=null){
+            throw new BusinessException(ResultCode.ORDER_COMMENT_EXITS);
+        }
+        repairComment = new RepairComment();
+        BeanUtils.copyProperties(param,repairComment);
+        repairCommentService.save(repairComment);
+
+        repairService.updateCommentStatus(param.getRepairId());
+
+    }
+
+
+    public void invoiceApply(RepairInvoice param) {
+        if(StringUtils.isBlank(param.getRepairId()) ){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        Repair repair = repairService.getById(param.getRepairId());
+        if(repair == null){
+            throw new BusinessException(ResultCode.ORDER_PAY_NOT_EXITS);
+        }
+
+        RepairInvoice repairInvoice = repairInvoiceService.getByRepairId(param.getRepairId());
+        if(repairInvoice !=null){
+            throw new BusinessException(ResultCode.ORDER_INVOICE_EXITS);
+        }
+        RepairPay repairPay = repairPayService.getByRepairId(param.getRepairId(), 1);
+        if(repairPay == null){
+            throw new BusinessException(ResultCode.ORDER_NOt_PAY);
+        }
+
+        repairInvoice = new RepairInvoice();
+        BeanUtils.copyProperties(param,repairInvoice);
+        repairService.updateInvoiceStatus(param.getRepairId());
+
+    }
+}

+ 0 - 0
src/main/java/com/fdkankan/sale/service/impl/RepairInfoService.java


Some files were not shown because too many files changed in this diff