Kaynağa Gözat

卡消费信息

yq 2 yıl önce
ebeveyn
işleme
5e942871ae
24 değiştirilmiş dosya ile 1573 ekleme ve 0 silme
  1. 73 0
      src/main/java/com/usky/dxtop/controller/web/business/ProductInfoController.java
  2. 84 0
      src/main/java/com/usky/dxtop/controller/web/business/ProductOrderController.java
  3. 44 0
      src/main/java/com/usky/dxtop/controller/web/business/ProductPeriodController.java
  4. 73 0
      src/main/java/com/usky/dxtop/controller/web/business/ProductTypeController.java
  5. 25 0
      src/main/java/com/usky/dxtop/mapper/ProductInfoMapper.java
  6. 16 0
      src/main/java/com/usky/dxtop/mapper/ProductOrderMapper.java
  7. 16 0
      src/main/java/com/usky/dxtop/mapper/ProductPeriodMapper.java
  8. 16 0
      src/main/java/com/usky/dxtop/mapper/ProductTypeMapper.java
  9. 94 0
      src/main/java/com/usky/dxtop/model/ProductInfo.java
  10. 130 0
      src/main/java/com/usky/dxtop/model/ProductOrder.java
  11. 36 0
      src/main/java/com/usky/dxtop/model/ProductPeriod.java
  12. 59 0
      src/main/java/com/usky/dxtop/model/ProductType.java
  13. 31 0
      src/main/java/com/usky/dxtop/service/ProductInfoService.java
  14. 58 0
      src/main/java/com/usky/dxtop/service/ProductOrderService.java
  15. 26 0
      src/main/java/com/usky/dxtop/service/ProductPeriodService.java
  16. 28 0
      src/main/java/com/usky/dxtop/service/ProductTypeService.java
  17. 214 0
      src/main/java/com/usky/dxtop/service/impl/ProductInfoServiceImpl.java
  18. 289 0
      src/main/java/com/usky/dxtop/service/impl/ProductOrderServiceImpl.java
  19. 56 0
      src/main/java/com/usky/dxtop/service/impl/ProductPeriodServiceImpl.java
  20. 79 0
      src/main/java/com/usky/dxtop/service/impl/ProductTypeServiceImpl.java
  21. 71 0
      src/main/resources/mapper/ProductInfoMapper.xml
  22. 26 0
      src/main/resources/mapper/ProductOrderMapper.xml
  23. 12 0
      src/main/resources/mapper/ProductPeriodMapper.xml
  24. 17 0
      src/main/resources/mapper/ProductTypeMapper.xml

+ 73 - 0
src/main/java/com/usky/dxtop/controller/web/business/ProductInfoController.java

@@ -0,0 +1,73 @@
+package com.usky.dxtop.controller.web.business;
+
+
+import com.usky.dxtop.common.annotation.RepeatSubmit;
+import com.usky.dxtop.common.core.domain.ApiResult;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.model.ProductInfo;
+import com.usky.dxtop.model.ProductType;
+import com.usky.dxtop.service.ProductInfoService;
+import com.usky.dxtop.service.vo.OrderRequest;
+import com.usky.dxtop.service.vo.ProductInfoRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * 商品详情
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@RestController
+@RequestMapping("/productInfo")
+public class ProductInfoController {
+
+
+    @Autowired
+    private ProductInfoService productInfoService;
+
+    /**
+     * 新增记录
+     * @param productInfo
+     * @return
+     */
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody ProductInfo productInfo){
+        productInfoService.add(productInfo);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改记录
+     */
+    @PutMapping
+    public ApiResult edit(@RequestBody ProductInfo productInfo)
+    {
+        return ApiResult.success(productInfoService.update(productInfo));
+    }
+
+    /**
+     * 记录查询
+     * @param productInfoRequest
+     * @return
+     */
+    @PostMapping("/list")
+    public ApiResult<CommonPage<ProductInfo>> list(@RequestBody ProductInfoRequest productInfoRequest)
+    {
+
+        return ApiResult.success(productInfoService.list(productInfoRequest));
+    }
+
+    /**
+     * 导出
+     * @param productInfoRequest
+     * @return
+     */
+    @PostMapping("/export")
+    public ApiResult<String> exportDetail(@RequestBody ProductInfoRequest productInfoRequest){
+        return ApiResult.success(productInfoService.export(productInfoRequest));
+    }
+}
+

+ 84 - 0
src/main/java/com/usky/dxtop/controller/web/business/ProductOrderController.java

@@ -0,0 +1,84 @@
+package com.usky.dxtop.controller.web.business;
+
+
+import com.usky.dxtop.common.core.domain.ApiResult;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.model.ProductOrder;
+import com.usky.dxtop.service.ProductOrderService;
+import com.usky.dxtop.service.vo.ProductOrderRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import java.util.List;
+
+/**
+ *  商品订单
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@RestController
+@RequestMapping("/productOrder")
+public class ProductOrderController {
+
+
+    @Autowired
+    private ProductOrderService productOrderService;
+
+
+
+    /**
+     * 新增
+     * @param productOrder
+     * @return
+     */
+    @PostMapping
+    public ApiResult add(@RequestBody ProductOrder productOrder){
+        productOrderService.add(productOrder);
+        return ApiResult.success();
+    }
+
+    /**
+     * 分页
+     * @param productOrderRequest
+     * @return
+     */
+    @PostMapping("/page")
+    public ApiResult<CommonPage<ProductOrder>> page(@RequestBody ProductOrderRequest productOrderRequest){
+        return ApiResult.success(productOrderService.page(productOrderRequest));
+    }
+
+    /**
+     * 导出
+     * @param productOrderRequest
+     * @return
+     */
+    @PostMapping("/export")
+    public ApiResult<String> export(@RequestBody ProductOrderRequest productOrderRequest){
+        return ApiResult.success(productOrderService.export(productOrderRequest));
+    }
+
+    /**
+     * 批量退订
+     * @param list
+     * @return
+     */
+    @PostMapping("/unsubscribeBath")
+    public ApiResult<Boolean> unsubscribeBath(@RequestBody List<ProductOrder> list){
+        return ApiResult.success(productOrderService.unsubscribeBath(list));
+    }
+
+    /**
+     * 订单汇总
+     * @param userId
+     * @return
+     */
+    @GetMapping("/orderCollect")
+    public ApiResult orderCollect(@RequestParam(required = false) Long userId){
+        return ApiResult.success(productOrderService.orderCollect(userId));
+    }
+
+}
+

+ 44 - 0
src/main/java/com/usky/dxtop/controller/web/business/ProductPeriodController.java

@@ -0,0 +1,44 @@
+package com.usky.dxtop.controller.web.business;
+
+
+import com.usky.dxtop.common.core.domain.ApiResult;
+import com.usky.dxtop.model.ProductPeriod;
+import com.usky.dxtop.service.ProductPeriodService;
+import io.swagger.annotations.ApiResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 商品周期
+ *
+ * @author yq
+ * @since 2022-07-08
+ */
+@RestController
+@RequestMapping("/productPeriod")
+public class ProductPeriodController {
+
+
+
+    @Autowired
+    private ProductPeriodService productPeriodService;
+
+
+    /**
+     * 分页
+     * @param productInfoId
+     * @return
+     */
+    @GetMapping
+    public ApiResult<List<ProductPeriod>> list(@RequestParam Long productInfoId){
+        return ApiResult.success(productPeriodService.list(productInfoId));
+    }
+}
+

+ 73 - 0
src/main/java/com/usky/dxtop/controller/web/business/ProductTypeController.java

@@ -0,0 +1,73 @@
+package com.usky.dxtop.controller.web.business;
+
+
+import com.usky.dxtop.common.annotation.RepeatSubmit;
+import com.usky.dxtop.common.constant.UserConstants;
+import com.usky.dxtop.common.core.domain.ApiResult;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.model.Company;
+import com.usky.dxtop.model.ProductType;
+import com.usky.dxtop.service.CompanyService;
+import com.usky.dxtop.service.ProductTypeService;
+import org.apache.commons.math3.stat.descriptive.summary.Product;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * 商品类型
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@RestController
+@RequestMapping("/productType")
+public class ProductTypeController {
+
+
+    @Autowired
+    private ProductTypeService productTypeService;
+
+    /**
+     * 新增记录
+     * @param productType
+     * @return
+     */
+    @RepeatSubmit
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody ProductType productType){
+        productTypeService.add(productType);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改记录
+     */
+    @PutMapping
+    public ApiResult edit(@RequestBody ProductType productType)
+    {
+        return ApiResult.success(productTypeService.update(productType));
+    }
+
+    /**
+     * 记录查询
+     * @param current 页数
+     * @param size 条数
+     * @param name 名称
+     * @param isTake 是否生效
+     * @return
+     */
+    @GetMapping("/list")
+    public ApiResult<CommonPage<ProductType>> list(@RequestParam Integer current,
+                                               @RequestParam Integer size,
+                                               @RequestParam(required = false) String name,
+                                               @RequestParam(required = false) Boolean isTake)
+    {
+
+        return ApiResult.success(productTypeService.list(current, size, name,isTake));
+    }
+
+}
+

+ 25 - 0
src/main/java/com/usky/dxtop/mapper/ProductInfoMapper.java

@@ -0,0 +1,25 @@
+package com.usky.dxtop.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.dxtop.model.ProductInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.usky.dxtop.service.vo.ProductInfoRequest;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 商品详情 Mapper 接口
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
+
+
+
+    Page<ProductInfo> page(IPage<ProductInfo> page, @Param("ar")ProductInfoRequest productInfoRequest);
+
+    int checkTime(ProductInfo productInfo);
+}

+ 16 - 0
src/main/java/com/usky/dxtop/mapper/ProductOrderMapper.java

@@ -0,0 +1,16 @@
+package com.usky.dxtop.mapper;
+
+import com.usky.dxtop.model.ProductOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+public interface ProductOrderMapper extends BaseMapper<ProductOrder> {
+
+}

+ 16 - 0
src/main/java/com/usky/dxtop/mapper/ProductPeriodMapper.java

@@ -0,0 +1,16 @@
+package com.usky.dxtop.mapper;
+
+import com.usky.dxtop.model.ProductPeriod;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-08
+ */
+public interface ProductPeriodMapper extends BaseMapper<ProductPeriod> {
+
+}

+ 16 - 0
src/main/java/com/usky/dxtop/mapper/ProductTypeMapper.java

@@ -0,0 +1,16 @@
+package com.usky.dxtop.mapper;
+
+import com.usky.dxtop.model.ProductType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 商品详情 Mapper 接口
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+public interface ProductTypeMapper extends BaseMapper<ProductType> {
+
+}

+ 94 - 0
src/main/java/com/usky/dxtop/model/ProductInfo.java

@@ -0,0 +1,94 @@
+package com.usky.dxtop.model;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 商品详情
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProductInfo implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 商品类别编号
+     */
+    private Long productTypeId;
+
+    /**
+     * 开始时间
+     */
+    private LocalTime startTime;
+
+    /**
+     * 结束时间
+     */
+    private LocalTime endTime;
+    /**
+     * 费浦设备类型编号
+     */
+    private String fpDeviceId;
+
+    /**
+     * 单价
+     */
+    private BigDecimal productPrice;
+
+    /**
+     * 重复周期
+     */
+    private String repetitionCysles;
+
+    /**
+     * 是否有效
+     */
+    private Long status;
+
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    private String updateBy;
+
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private List<String> cysles;
+
+    @TableField(exist = false)
+    private String productTypeName;
+
+}

+ 130 - 0
src/main/java/com/usky/dxtop/model/ProductOrder.java

@@ -0,0 +1,130 @@
+package com.usky.dxtop.model;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProductOrder implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNumber;
+
+    /**
+     * tOrder订单编号
+     */
+    private String tOrderNumber;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 商品详情编号
+     */
+    private Long productInfoId;
+
+    /**
+     * 商品类型名称
+     */
+    private String productTypeName;
+
+    /**
+     * 商品类型编号
+     */
+    private Long productTypeId;
+
+    /**
+     * 订单状态
+     */
+    private Integer orderFlag;
+
+    /**
+     * 用户编号
+     */
+    private Long userId;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderMoney;
+
+    /**
+     * 用户手机号
+     */
+    private String userPhone;
+    /**
+     * 费浦用户编号
+     */
+    private String userCode;
+    /**
+     * 卡号
+     */
+    private String card;
+    /**
+     * 预约时间
+     */
+    private Date appointmentTime;
+
+    /**
+     * 费浦设备类型编号
+     */
+    private String fpDeviceId;
+
+    /**
+     * 开始时间
+     */
+    private LocalTime startTime;
+
+    /**
+     * 结束时间
+     */
+    private LocalTime endTime;
+
+    private Date createTime;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    private String updateBy;
+
+    private Date updateTime;
+
+
+}

+ 36 - 0
src/main/java/com/usky/dxtop/model/ProductPeriod.java

@@ -0,0 +1,36 @@
+package com.usky.dxtop.model;
+
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProductPeriod implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     *  
+     */
+    private Long id;
+
+    private Long productInfoId;
+
+    /**
+     * 周期
+     */
+    private String period;
+
+
+}

+ 59 - 0
src/main/java/com/usky/dxtop/model/ProductType.java

@@ -0,0 +1,59 @@
+package com.usky.dxtop.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 商品详情
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProductType implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 是否生效
+     */
+    private Integer isTake;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private LocalDateTime createTime;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    private String updateBy;
+
+    private LocalDateTime updateTime;
+
+
+}

+ 31 - 0
src/main/java/com/usky/dxtop/service/ProductInfoService.java

@@ -0,0 +1,31 @@
+package com.usky.dxtop.service;
+
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.model.ProductInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.usky.dxtop.model.ProductType;
+import com.usky.dxtop.service.vo.ProductInfoRequest;
+
+/**
+ * <p>
+ * 商品详情 服务类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+public interface ProductInfoService extends IService<ProductInfo> {
+
+
+    boolean add(ProductInfo productInfo);
+
+    boolean update(ProductInfo productInfo);
+
+    String checkNameUnique(ProductInfo productInfo);
+
+    CommonPage<ProductInfo> list(ProductInfoRequest productInfoRequest);
+
+    String export(ProductInfoRequest productInfoRequest);
+
+    boolean remove(Long id);
+}

+ 58 - 0
src/main/java/com/usky/dxtop/service/ProductOrderService.java

@@ -0,0 +1,58 @@
+package com.usky.dxtop.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.model.ProductOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.usky.dxtop.service.vo.ProductInfoRequest;
+import com.usky.dxtop.service.vo.ProductOrderRequest;
+import org.apache.commons.math3.stat.descriptive.summary.Product;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+public interface ProductOrderService extends IService<ProductOrder> {
+
+
+    /**
+     * 新增
+     * @param productOrder
+     * @return
+     */
+    Boolean add(ProductOrder productOrder);
+
+    /**
+     * 分页
+     * @param productOrderRequest
+     * @return
+     */
+    CommonPage<ProductOrder> page(ProductOrderRequest productOrderRequest);
+
+
+    String export(ProductOrderRequest productOrderRequest);
+
+    /**
+     * 批量退订
+     * @param list
+     * @return
+     */
+    Boolean unsubscribeBath(List<ProductOrder> list);
+
+    /**
+     * 订单统计
+     * @param userId
+     * @return
+     */
+    Map<String,Object> orderCollect(Long userId);
+
+
+    public void checkCarPayResult(ProductOrder productOrder, JSONObject jsonObject);
+}

+ 26 - 0
src/main/java/com/usky/dxtop/service/ProductPeriodService.java

@@ -0,0 +1,26 @@
+package com.usky.dxtop.service;
+
+import com.usky.dxtop.model.ProductInfo;
+import com.usky.dxtop.model.ProductPeriod;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-08
+ */
+public interface ProductPeriodService extends IService<ProductPeriod> {
+
+
+    void removeByProductInfo(Long productInfoId);
+
+    void insertList(ProductInfo productInfo);
+
+
+    List<ProductPeriod> list(Long productInfoId);
+}

+ 28 - 0
src/main/java/com/usky/dxtop/service/ProductTypeService.java

@@ -0,0 +1,28 @@
+package com.usky.dxtop.service;
+
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.model.Company;
+import com.usky.dxtop.model.ProductType;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 商品详情 服务类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+public interface ProductTypeService extends IService<ProductType> {
+
+    boolean add(ProductType productType);
+
+    boolean update(ProductType productType);
+
+    String checkNameUnique(ProductType productType);
+
+    CommonPage<ProductType> list(Integer current, Integer size, String name,Boolean isTake);
+
+    boolean remove(Long id);
+
+}

+ 214 - 0
src/main/java/com/usky/dxtop/service/impl/ProductInfoServiceImpl.java

@@ -0,0 +1,214 @@
+package com.usky.dxtop.service.impl;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sun.jna.platform.win32.Winspool;
+import com.sun.org.apache.xpath.internal.operations.Bool;
+import com.usky.dxtop.common.constant.UserConstants;
+import com.usky.dxtop.common.core.domain.model.LoginUser;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.common.utils.*;
+import com.usky.dxtop.model.*;
+import com.usky.dxtop.mapper.ProductInfoMapper;
+import com.usky.dxtop.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.usky.dxtop.service.emun.AsyncResultType;
+import com.usky.dxtop.service.vo.OrderExport;
+import com.usky.dxtop.service.vo.OrderRequest;
+import com.usky.dxtop.service.vo.ProductInfoExport;
+import com.usky.dxtop.service.vo.ProductInfoRequest;
+import jdk.nashorn.internal.ir.LiteralNode;
+import org.apache.commons.math3.stat.descriptive.summary.Product;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.security.core.parameters.P;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 商品详情 服务实现类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@Service
+public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, ProductInfo> implements ProductInfoService {
+
+    @Autowired
+    private ProductTypeService productTypeService;
+
+    @Autowired
+    private ISysAsyncTaskService sysAsyncTaskService;
+
+    @Autowired
+    private SysFileService sysFileService;
+
+    @Autowired
+    private ProductPeriodService productPeriodService;
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean add(ProductInfo productInfo) {
+        if (UserConstants.NOT_UNIQUE.equals(this.checkNameUnique(productInfo)))
+        {
+            throw new CustomException("新增商品信息'" + productInfo.getProductName() + "'失败,商品名称已存在");
+        }
+        checkTimeBetween(productInfo);
+        this.save(productInfo);
+        productPeriodService.insertList(productInfo);
+        return true;
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean update(ProductInfo productInfo) {
+        if (UserConstants.NOT_UNIQUE.equals(this.checkNameUnique(productInfo)))
+        {
+            throw new CustomException("修改商品信息'" + productInfo.getProductName() + "'失败,商品名称已存在");
+        }
+        checkTimeBetween(productInfo);
+        productPeriodService.removeByProductInfo(productInfo.getId());
+        productPeriodService.insertList(productInfo);
+        return this.updateById(productInfo);
+    }
+
+    @Override
+    public String checkNameUnique(ProductInfo productInfo) {
+        Long id = StringUtils.isNull(productInfo.getId()) ? -1L : productInfo.getId();
+        LambdaQueryWrapper<ProductInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProductInfo::getProductName,productInfo.getProductName())
+                .eq(ProductInfo::getProductTypeId,productInfo.getProductTypeId());
+        ProductInfo one = this.getOne(queryWrapper);
+        if (StringUtils.isNotNull(one) && one.getId() != id.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+
+    public void checkTimeBetween(ProductInfo productInfo){
+        if (baseMapper.checkTime(productInfo) > 0){
+            throw new CustomException("选择的时间和周期有重复,重新选择");
+        }
+
+    }
+
+    @Override
+    public CommonPage<ProductInfo> list(ProductInfoRequest productInfoRequest) {
+        IPage<ProductInfo> page = new Page<>(productInfoRequest.getCurrent(), productInfoRequest.getSize());
+        baseMapper.page(page,productInfoRequest);
+        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public String export(ProductInfoRequest productInfoRequest) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        Long taskId = sysAsyncTaskService.getId(user.getUserName(), "订单详情");
+        if (null == taskId) {
+            throw new CustomException("获取次数太多了请稍后获取");
+        }
+        ((ProductInfoServiceImpl) AopContext.currentProxy()).syncInfo(taskId,productInfoRequest);
+        return String.valueOf(taskId);
+    }
+
+
+    @Async
+    public void syncInfo(Long taskId, ProductInfoRequest productInfoRequest){
+        Workbook workbook = null;
+        try {
+            ExportParams params = new ExportParams(null, "商品详情");
+            workbook = ExcelExportUtil.exportBigExcel(params, ProductInfoExport.class,
+                    (o, i) -> {
+                        productInfoRequest.setCurrent(i);
+                        productInfoRequest.setSize(30);
+                        CommonPage<ProductInfo> page = this.list(productInfoRequest);
+                        return new ArrayList<>(BeanMapperUtils.mapList(page.getRecords(), ProductInfo.class, ProductInfoExport.class));
+                    },null);
+            if (null != workbook) {
+                String fileName = String.format("%s.xls", "商品详情");
+                MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
+                uploadOrderFile(multipartFile,taskId);
+            } else {
+                sysAsyncTaskService.sendResult(taskId, false, "商品详情表格数据为空", AsyncResultType.TEXT);
+            }
+        } catch (Exception e) {
+            log.error("导出文件失败", e);
+            sysAsyncTaskService.sendResult(taskId, false, "导出订单文件失败", AsyncResultType.TEXT);
+        } finally {
+            if (workbook != null) {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    log.error("===export spec=== 关闭workbook失败", e);
+                }
+            }
+        }
+    }
+
+    public void uploadOrderFile(MultipartFile multipartFile, Long taskId){
+        List<MultipartFile> list = new ArrayList<>();
+        list.add(multipartFile);
+        String batchNo = sysFileService.generateBatchNo();
+        SysFile sysFile = new SysFile();
+        sysFile.setBatchNo(batchNo);
+        sysFile.setFiles(list);
+        sysFile.setUploadType(SysFileServiceImpl.FILE);
+        sysFile.setBusinessType("商品详情");
+        sysFile.setExpriceAt(DateUtils.addDays(new Date(), 3));
+        List<SysFile> sysFileList = sysFileService.addFile(sysFile);
+        long count = sysFileList.stream().filter(sysFileDTO -> !sysFileDTO.getSuccess()).count();
+        if (count > 0) {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+            return;
+        }
+        List<String> idList = sysFileList.stream().map(sf -> sf.getId().toString()).collect(Collectors.toList());
+        boolean active = sysFileService.active(batchNo,idList);
+        if (active) {
+            sysAsyncTaskService.sendResult(taskId, true, batchNo, AsyncResultType.FILE);
+        } else {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+        }
+    }
+
+
+
+
+
+    public List<ProductType> getByIds(List<Long> produceTypeId){
+        LambdaQueryWrapper<ProductType> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper
+                .select(ProductType::getId,ProductType::getName)
+                .in(ProductType::getId,produceTypeId);
+        return productTypeService.list(queryWrapper);
+    }
+
+    public void enhanceDate(ProductInfo productInfo,ProductType productType){
+        productInfo.setProductTypeName(productType.getName());
+    }
+
+
+    @Override
+    public boolean remove(Long id) {
+        return false;
+    }
+}

+ 289 - 0
src/main/java/com/usky/dxtop/service/impl/ProductOrderServiceImpl.java

@@ -0,0 +1,289 @@
+package com.usky.dxtop.service.impl;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.dxtop.common.core.domain.model.LoginUser;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.common.utils.*;
+import com.usky.dxtop.common.utils.http.HttpUtils;
+import com.usky.dxtop.model.*;
+import com.usky.dxtop.mapper.ProductOrderMapper;
+import com.usky.dxtop.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.usky.dxtop.service.api.OneCardApi;
+import com.usky.dxtop.service.api.TopApiConfiger;
+import com.usky.dxtop.service.emun.*;
+import com.usky.dxtop.service.vo.ProductInfoExport;
+import com.usky.dxtop.service.vo.ProductInfoRequest;
+import com.usky.dxtop.service.vo.ProductOrderExport;
+import com.usky.dxtop.service.vo.ProductOrderRequest;
+import org.apache.logging.log4j.core.util.JsonUtils;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+import oshi.jna.platform.windows.NtDll;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.file.OpenOption;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@Service
+public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
+
+
+    public static final String CARD_PAY = "卡消费";
+
+    public static final String FIND_ORDER_INFO = "卡消费交易查询";
+
+    public static final String FP_SET_PERMISSION  = "费浦门禁权限";
+
+    @Autowired
+    private StaffService staffService;
+
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private MsgLogService msgLogService;
+
+    @Autowired
+    private CallApiLogService callApiLogService;
+
+
+    @Autowired
+    private SysFileService sysFileService;
+
+    @Autowired
+    private ISysAsyncTaskService sysAsyncTaskService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean add(ProductOrder productOrder) {
+        checkOrder(productOrder,staffService.getById(productOrder.getUserId()));
+        this.save(productOrder);
+        ((ProductOrderServiceImpl) AopContext.currentProxy()).oneCardPayApi(productOrder);
+        return true;
+    }
+
+    @Override
+    public CommonPage<ProductOrder> page(ProductOrderRequest productOrderRequest) {
+        IPage<ProductOrder> page = new Page<>(productOrderRequest.getCurrent(), productOrderRequest.getSize());
+        LambdaQueryWrapper<ProductOrder> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper
+                .like(StringUtils.isNotBlank(productOrderRequest.getUserName()),ProductOrder::getUserName,productOrderRequest.getUserName())
+                .eq(null != productOrderRequest.getProductTypeId(),ProductOrder::getProductTypeId,productOrderRequest.getProductTypeId())
+                .eq(null != productOrderRequest.getUserId(),ProductOrder::getUserId,productOrderRequest.getUserId())
+                .ge(null != productOrderRequest.getStartTime(),ProductOrder::getStartTime,productOrderRequest.getStartTime())
+                .le(null != productOrderRequest.getEndTime(),ProductOrder::getEndTime,productOrderRequest.getEndTime())
+                .eq(null != productOrderRequest.getAppointmentTime(),ProductOrder::getAppointmentTime,productOrderRequest.getEndTime())
+                .eq(null != productOrderRequest.getProductStatus(),ProductOrder::getOrderFlag,productOrderRequest.getProductStatus());
+        page = this.page(page, queryWrapper);
+        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public String export(ProductOrderRequest productOrderRequest) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        Long taskId = sysAsyncTaskService.getId(user.getUserName(), "订单详情");
+        if (null == taskId) {
+            throw new CustomException("获取次数太多了请稍后获取");
+        }
+        ((ProductOrderServiceImpl) AopContext.currentProxy()).syncInfo(taskId,productOrderRequest);
+        return String.valueOf(taskId);
+    }
+
+
+
+    @Async
+    public void syncInfo(Long taskId, ProductOrderRequest productOrderRequest){
+        Workbook workbook = null;
+        try {
+            ExportParams params = new ExportParams(null, "商品订单详情");
+            workbook = ExcelExportUtil.exportBigExcel(params, ProductInfoExport.class,
+                    (o, i) -> {
+                        productOrderRequest.setCurrent(i);
+                        productOrderRequest.setSize(30);
+                        CommonPage<ProductOrder> page = this.page(productOrderRequest);
+                        return new ArrayList<>(BeanMapperUtils.mapList(page.getRecords(), ProductOrder.class, ProductOrderExport.class));
+                    },null);
+            if (null != workbook) {
+                String fileName = String.format("%s.xls", "商品订单详情");
+                MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
+                uploadOrderFile(multipartFile,taskId);
+            } else {
+                sysAsyncTaskService.sendResult(taskId, false, "商品订单详情表格数据为空", AsyncResultType.TEXT);
+            }
+        } catch (Exception e) {
+            log.error("导出文件失败", e);
+            sysAsyncTaskService.sendResult(taskId, false, "导出订单文件失败", AsyncResultType.TEXT);
+        } finally {
+            if (workbook != null) {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    log.error("===export spec=== 关闭workbook失败", e);
+                }
+            }
+        }
+    }
+
+    public void uploadOrderFile(MultipartFile multipartFile, Long taskId){
+        List<MultipartFile> list = new ArrayList<>();
+        list.add(multipartFile);
+        String batchNo = sysFileService.generateBatchNo();
+        SysFile sysFile = new SysFile();
+        sysFile.setBatchNo(batchNo);
+        sysFile.setFiles(list);
+        sysFile.setUploadType(SysFileServiceImpl.FILE);
+        sysFile.setBusinessType("商品订单详情");
+        sysFile.setExpriceAt(DateUtils.addDays(new Date(), 3));
+        List<SysFile> sysFileList = sysFileService.addFile(sysFile);
+        long count = sysFileList.stream().filter(sysFileDTO -> !sysFileDTO.getSuccess()).count();
+        if (count > 0) {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+            return;
+        }
+        List<String> idList = sysFileList.stream().map(sf -> sf.getId().toString()).collect(Collectors.toList());
+        boolean active = sysFileService.active(batchNo,idList);
+        if (active) {
+            sysAsyncTaskService.sendResult(taskId, true, batchNo, AsyncResultType.FILE);
+        } else {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+        }
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean unsubscribeBath(List<ProductOrder> list) {
+        List<MsgLog> msgLogs;
+        List<Order> orderList;
+        try {
+            //批量添加订单
+            orderList = list.stream().map(this::generateReturnOrder).collect(Collectors.toList());
+            orderService.saveBatch(orderList);
+            //生成消息日志
+            msgLogs = orderList.stream().map(order -> orderService.enhanceMsgLog(order)).collect(Collectors.toList());
+            //批量添加消息日志
+            msgLogService.saveBatch(msgLogs);
+        }catch (Exception e){
+            throw new CustomException("数据库异常请联系管理员,异常信息"+e.getMessage());
+        }
+        this.updateBatchById(list);
+        orderService.sendMessage(orderList,msgLogs);
+        try {
+            orderService.updateBatchById(orderList);
+        }catch (Exception e){
+            log.error("订单退订修Torder失败+++++++++++++++"+e.getMessage());
+        }
+        return true;
+    }
+
+    @Override
+    public Map<String, Object> orderCollect(Long userId) {
+        Map<String,Object> map = new HashMap<>();
+        QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("count(id) as money","order_flag as orderFlag")
+                .eq(null != userId,"user_id",userId)
+                .groupBy("orderFlag");
+        map.put("orderFlagList",this.getMap(queryWrapper));
+        QueryWrapper<ProductOrder> sumQueryWrapper = new QueryWrapper<>();
+        queryWrapper.select("IFNULL(sum(order_money),0) as moneyTotal","IFNULL(sum(end_time-start_time),0) as timeTotal")
+                .eq("order_flag",ProductOrderStatus.SUCCESS.getCode())
+                .eq(null != userId,"user_id",userId);
+        map.put("sumCollect",this.getMap(sumQueryWrapper));
+        return map;
+    }
+
+    public void checkOrder(ProductOrder productOrder, Staff staff){
+        String orderNumber = TopApiConfiger.getOrderNumber();
+        productOrder.setOrderNumber(orderNumber);
+        BigDecimal money = productOrder.getOrderMoney();
+        Assert.check(null != money && money.compareTo(BigDecimal.ZERO)  != 0,"请输入订单金额");
+        String[] str=money.toString().split("\\.");
+        Assert.check(str[0].length() <= 10 && str[1].length() <= 2,"订单整数不能超过十位,小数不能超过两位");
+        Assert.check(null != productOrder.getUserId() && 0 != productOrder.getUserId(),"用户编号不能为空");
+        Optional.ofNullable(staff).orElseThrow(() -> new CustomException("用户信息不存在"));
+        Assert.check(staff.getIsSuccess(),"人员:"+staff.getName()+"未同步或者同步失败,请手动同步人员信息");
+        productOrder.setUserName(staff.getUsername());
+        productOrder.setUserPhone(staff.getContacts());
+        productOrder.setUserCode(staff.getUserCode());
+        productOrder.setOrderFlag(ProductOrderStatus.NO_PAY.getCode());
+    }
+
+
+    /**
+     * 调用雄伟卡消费api
+     */
+    public void oneCardPayApi(ProductOrder productOrder){
+        TreeMap<String, String> param = OneCardApi.cardPayParam(productOrder);
+        Map<String,String> map = new HashMap<>();
+        map.put("Content-Type","application/x-www-form-urlencoded");
+        String result;
+        try {
+            result = OneCardApi.commonRequest(OneCardApi.CARD_PAY_URL,OneCardApi.joinParam(param),map,jsonObject -> {
+                checkCarPayResult(productOrder,jsonObject);
+                this.updateById(productOrder);
+                return true;
+            });
+        }catch (Exception e){
+            result = e.getMessage();
+            log.error("调用雄伟卡消费异常,订单编号:"+productOrder.getOrderNumber()+"异常信息"+e.getMessage());
+        }
+        callApiLogService.saveOrUpdate(productOrder.getOrderNumber(),CARD_PAY, OneCardApi.CARD_PAY_URL, JSONObject.toJSONString(param), result);
+    }
+
+    @Override
+    public void checkCarPayResult(ProductOrder productOrder,JSONObject jsonObject){
+        if ("1".equals(jsonObject.get("code"))){
+            productOrder.setOrderFlag(ProductOrderStatus.TAKE.getCode());
+        }else {
+            productOrder.setOrderFlag(ProductOrderStatus.DISH_ERROR.getCode());
+        }
+    }
+
+
+    /**
+     * 生成退订订单
+     * @param productOrder
+     */
+    public Order generateReturnOrder(ProductOrder productOrder){
+        Order order = new Order();
+        order.setUserId(productOrder.getUserId());
+        order.setUserName(productOrder.getUserName());
+        order.setUserPhone(productOrder.getUserPhone());
+        order.setMoney(productOrder.getOrderMoney());
+        order.setCard(productOrder.getCard());
+        order.setPayType(OrderPayType.XJ.getPayCode());
+        order.setScene(OrderSceneCode.BACK_STAGE.getCode());
+        order.setOrderFlag(OrderStatus.PAYMENT_ERROR_DEBIT.getCode());
+        String orderNumber = TopApiConfiger.getOrderNumber();
+        order.setOrderNumber(orderNumber);
+        productOrder.setTOrderNumber(orderNumber);
+        productOrder.setOrderFlag(ProductOrderStatus.RETURN_ORDER.getCode());
+        return order;
+    }
+}

+ 56 - 0
src/main/java/com/usky/dxtop/service/impl/ProductPeriodServiceImpl.java

@@ -0,0 +1,56 @@
+package com.usky.dxtop.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.model.ProductInfo;
+import com.usky.dxtop.model.ProductPeriod;
+import com.usky.dxtop.mapper.ProductPeriodMapper;
+import com.usky.dxtop.service.ProductPeriodService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.security.core.parameters.P;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-08
+ */
+@Service
+public class ProductPeriodServiceImpl extends ServiceImpl<ProductPeriodMapper, ProductPeriod> implements ProductPeriodService {
+
+    @Override
+    public void removeByProductInfo(Long productInfoId) {
+        LambdaQueryWrapper<ProductPeriod> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProductPeriod::getProductInfoId,productInfoId);
+        this.remove(queryWrapper);
+    }
+
+    @Override
+    public void insertList(ProductInfo productInfo) {
+        if (CollectionUtils.isEmpty(productInfo.getCysles())){
+            throw new CustomException("循环周期不能为空");
+        }
+        this.saveBatch(productInfo.getCysles().stream()
+                .map(s -> {
+                    ProductPeriod productPeriod = new ProductPeriod();
+                    productPeriod.setProductInfoId(productInfo.getId());
+                    productPeriod.setPeriod(s);
+                    return productPeriod;
+                }).collect(Collectors.toList()));
+    }
+
+    @Override
+    public List<ProductPeriod> list(Long productInfoId) {
+        LambdaQueryWrapper<ProductPeriod> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProductPeriod::getProductInfoId,productInfoId);
+        return this.list(queryWrapper);
+    }
+}

+ 79 - 0
src/main/java/com/usky/dxtop/service/impl/ProductTypeServiceImpl.java

@@ -0,0 +1,79 @@
+package com.usky.dxtop.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.dxtop.common.constant.UserConstants;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.common.utils.StringUtils;
+import com.usky.dxtop.model.Company;
+import com.usky.dxtop.model.ProductType;
+import com.usky.dxtop.mapper.ProductTypeMapper;
+import com.usky.dxtop.service.ProductTypeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ * 商品详情 服务实现类
+ * </p>
+ *
+ * @author yq
+ * @since 2022-07-05
+ */
+@Service
+public class ProductTypeServiceImpl extends ServiceImpl<ProductTypeMapper, ProductType> implements ProductTypeService {
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean add(ProductType productType) {
+        if (UserConstants.NOT_UNIQUE.equals(this.checkNameUnique(productType)))
+        {
+            throw new CustomException("新增商品类别信息'" + productType.getName() + "'失败,商品类别已存在");
+        }
+        return this.save(productType);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean update(ProductType productType) {
+        if (UserConstants.NOT_UNIQUE.equals(this.checkNameUnique(productType)))
+        {
+            throw new CustomException("修改商品类别信息'" + productType.getName() + "'失败,商品类别已存在");
+        }
+        return this.updateById(productType);
+    }
+
+    @Override
+    public String checkNameUnique(ProductType productType) {
+        Long id = StringUtils.isNull(productType.getId()) ? -1L : productType.getId();
+        LambdaQueryWrapper<ProductType> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ProductType::getName,productType.getName());
+        ProductType one = this.getOne(queryWrapper);
+        if (StringUtils.isNotNull(one) && one.getId() != id.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    @Override
+    public CommonPage<ProductType> list(Integer current, Integer size, String name, Boolean isTake) {
+        IPage<ProductType> page = new Page<>(current, size);
+        LambdaQueryWrapper<ProductType> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.like(StringUtils.isNotBlank(name),ProductType::getName,name)
+                .eq(null != isTake,ProductType::getIsTake,isTake)
+                .orderByDesc(ProductType::getId);
+        page = this.page(page,queryWrapper);
+        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public boolean remove(Long id) {
+        return false;
+    }
+}

+ 71 - 0
src/main/resources/mapper/ProductInfoMapper.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.dxtop.mapper.ProductInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.dxtop.model.ProductInfo">
+        <id column="id" property="id" />
+        <result column="product_name" property="productName" />
+        <result column="product_type_id" property="productTypeId" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="product_price" property="productPrice" />
+        <result column="repetition_cysles" property="repetitionCysles" />
+        <result column="status" property="status" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+    <select id="page" resultType="com.usky.dxtop.model.ProductInfo">
+        select pi.*,pt.name as productTypeName,group_concat(pp.period)
+        from product_info as pi
+        inner join product_period as pp
+        on pi.id = pp.product_info_id
+        inner join product_type as pt
+        on pi.product_type_id = pt.id
+        <where>
+            <if test="ar.startTime != null and ar.endTime != null">
+                and  pi.start_time &lt;= #{ar.startTime}
+                and  pi.end_time >= #{ar.endTime}
+            </if>
+            <if test="ar.status != null">
+                and pi.status = #{ar.status}
+            </if>
+            <if test="ar.name !=null and ar.name != ''">
+                and pi.name like concat('%', #{name}, '%')
+            </if>
+            <if test="ar.produceTypeId != null">
+                and pi.product_type_id = #{ar.produceTypeId}
+            </if>
+            <if test="ar.cys!=null and ar.cys.size()&gt; 0">
+                <foreach collection="ar.cys" item="period" separator="," open="and pp.period in(" close=")">
+                    #{period}
+                </foreach>
+            </if>
+        </where>
+        group by pi.id
+        order by pi.id desc
+    </select>
+    <select id="checkTime" resultType="java.lang.Integer">
+        select count(*)
+        from product_info as pi
+        inner join product_period as pp
+        on pi.id = pp.product_info_id
+        <where>
+            <if test="startTime != null and endTime != null">
+                and pi.end_time >= #{startTime}
+                and pi.start_time &lt;= #{endTime}
+            </if>
+            <if test="productTypeId != null">
+                and pi.product_type_id = #{productTypeId}
+            </if>
+            <if test="cysles !=null and cysles.size()&gt; 0">
+                <foreach collection="cysles" item="period" separator="," open="and pp.period in(" close=")">
+                    #{period}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 26 - 0
src/main/resources/mapper/ProductOrderMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.dxtop.mapper.ProductOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.dxtop.model.ProductOrder">
+        <id column="id" property="id" />
+        <result column="order_number" property="orderNumber" />
+        <result column="product_name" property="productName" />
+        <result column="product_info_id" property="productInfoId" />
+        <result column="product_type_name" property="productTypeName" />
+        <result column="product_type_id" property="productTypeId" />
+        <result column="order_flag" property="orderFlag" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="order_money" property="orderMoney" />
+        <result column="user_phone" property="userPhone" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

+ 12 - 0
src/main/resources/mapper/ProductPeriodMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.dxtop.mapper.ProductPeriodMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.dxtop.model.ProductPeriod">
+        <id column="id" property="id" />
+        <result column="product_info_id" property="productInfoId" />
+        <result column="period" property="period" />
+    </resultMap>
+
+</mapper>

+ 17 - 0
src/main/resources/mapper/ProductTypeMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.dxtop.mapper.ProductTypeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.dxtop.model.ProductType">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="is_take" property="isTake" />
+        <result column="remark" property="remark" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>