diff --git a/hiver-admin/src/main/resources/application.yml b/hiver-admin/src/main/resources/application.yml
index d2e60c6a..639fa094 100644
--- a/hiver-admin/src/main/resources/application.yml
+++ b/hiver-admin/src/main/resources/application.yml
@@ -287,6 +287,7 @@ ignored:
# 临时增加
- /hiver/app/**
- /hiver/thorui/**
+ - /hiver/order/**
# 限流及黑名单不拦截的路径
limitUrls:
- /**/*.js
@@ -351,4 +352,7 @@ logging:
# 最大保存天数
max-history: 7
# 每个文件最大大小
- max-file-size: 5MB
\ No newline at end of file
+ max-file-size: 5MB
+jpush:
+ appKey: 130f556e8473c9b558777fe3
+ masterSecret: 2b4e5196dfc40a78db36480d
\ No newline at end of file
diff --git a/hiver-core/pom.xml b/hiver-core/pom.xml
index f3039e4e..6939a04e 100644
--- a/hiver-core/pom.xml
+++ b/hiver-core/pom.xml
@@ -138,5 +138,15 @@
org.seleniumhq.selenium
selenium-java
+
+ cn.jpush.api
+ jpush-client
+ 3.2.17
+
+
+ cn.jpush.api
+ jiguang-common
+ 1.1.12
+
\ No newline at end of file
diff --git a/hiver-core/src/main/java/cc/hiver/core/config/jpush/JPushConfig.java b/hiver-core/src/main/java/cc/hiver/core/config/jpush/JPushConfig.java
new file mode 100644
index 00000000..65f1dc8f
--- /dev/null
+++ b/hiver-core/src/main/java/cc/hiver/core/config/jpush/JPushConfig.java
@@ -0,0 +1,24 @@
+package cc.hiver.core.config.jpush;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import cn.jiguang.common.ClientConfig;
+import cn.jpush.api.JPushClient;
+
+@Configuration
+public class JPushConfig {
+
+ @Value("${jpush.appKey}")
+ private String appKey;
+
+ @Value("${jpush.masterSecret}")
+ private String masterSecret;
+
+ @Bean
+ public JPushClient jPushClient() {
+ ClientConfig clientConfig = ClientConfig.getInstance();
+ return new JPushClient(masterSecret, appKey, null, clientConfig);
+ }
+}
diff --git a/hiver-core/src/main/java/cc/hiver/core/service/JPushService.java b/hiver-core/src/main/java/cc/hiver/core/service/JPushService.java
new file mode 100644
index 00000000..c113b9a6
--- /dev/null
+++ b/hiver-core/src/main/java/cc/hiver/core/service/JPushService.java
@@ -0,0 +1,36 @@
+package cc.hiver.core.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.jpush.api.JPushClient;
+import cn.jpush.api.push.PushResult;
+import cn.jpush.api.push.model.Message;
+import cn.jpush.api.push.model.PushPayload;
+import cn.jpush.api.push.model.notification.Notification;
+
+@Service
+public class JPushService {
+
+ private final JPushClient jPushClient;
+
+ @Autowired
+ public JPushService(JPushClient jPushClient) {
+ this.jPushClient = jPushClient;
+ }
+
+ public void sendPushNotification(String registrationId, String message) {
+ PushPayload payload = PushPayload.newBuilder()
+ .setPlatform(cn.jpush.api.push.model.Platform.all())
+ .setAudience(cn.jpush.api.push.model.audience.Audience.registrationId(registrationId))
+ .setNotification(Notification.alert(message))
+ .build();
+
+ try {
+ PushResult result = jPushClient.sendPush(payload);
+ System.out.println("Push result: " + result);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PushController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PushController.java
new file mode 100644
index 00000000..5364f7f6
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PushController.java
@@ -0,0 +1,24 @@
+package cc.hiver.mall.controller;
+
+import cc.hiver.core.service.JPushService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class PushController {
+
+ private final JPushService jPushService;
+
+ @Autowired
+ public PushController(JPushService jPushService) {
+ this.jPushService = jPushService;
+ }
+
+ @GetMapping("/push")
+ public String pushNotification(@RequestParam String registrationId, @RequestParam String message) {
+ jPushService.sendPushNotification(registrationId, message);
+ return "Push request sent!";
+ }
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java
new file mode 100644
index 00000000..963c83b5
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java
@@ -0,0 +1,136 @@
+package cc.hiver.mall.controller;
+
+import cc.hiver.core.common.utils.ResultUtil;
+import cc.hiver.core.common.utils.SecurityUtil;
+import cc.hiver.core.common.utils.StringUtils;
+import cc.hiver.core.common.vo.Result;
+import cc.hiver.mall.entity.*;
+
+
+import cc.hiver.mall.pojo.dto.SaleDTO;
+import cc.hiver.mall.pojo.vo.SaleQueryVO;
+import cc.hiver.mall.pojo.vo.SaleVO;
+import cc.hiver.mall.service.*;
+import cc.hiver.mall.service.mybatis.SaleDetailService;
+import cc.hiver.mall.service.mybatis.SaleService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Slf4j
+@RestController
+@Api(tags = "销售订单接口")
+@RequestMapping(value = "/hiver/app/sale/")
+@Transactional
+public class SaleController {
+ @Autowired
+ private SalesAndDetailsService salesAndDetailsService;
+
+ @Autowired
+ private StockAndLogService stockAndLogService;
+
+ @Autowired
+ private RushOrderService rushOrderService;
+
+ @Autowired
+ private SendMessageService sendMessageService;
+
+ @Autowired
+ private SaleService saleService;
+
+ @Autowired
+ private SaleDetailService saleDetailService;
+
+ @Autowired
+ private SecurityUtil securityUtil;
+
+
+ @RequestMapping(value = "/buy", method = RequestMethod.POST)
+ @ApiOperation(value = "下单操作")
+ @Transactional
+ public Result buy(@RequestBody SaleDTO saleDTO) {
+
+ /**
+ * 订单中是物流且包含扛包工人员的话,直接进入抢单表
+ * */
+ //1.处理订单表模块
+ Sale sale = salesAndDetailsService.handleSalesAndDetails(saleDTO);
+ //更新sale
+ saleDTO.setSale(sale);
+ //2.处理库存模块
+ stockAndLogService.handleSubStockAndLog(saleDTO.getSaleDetailList());
+ //3.处理抢单模块
+ rushOrderService.handleRushOrder(saleDTO);
+ //4.消息推送模块
+ sendMessageService.handleSendAppMessage();
+
+ return ResultUtil.success("下单成功");
+
+ }
+
+ @RequestMapping(value = "/edit", method = RequestMethod.POST)
+ @ApiOperation(value = "根据id修改货品属性")
+ public Result edit(SaleQueryVO saleQueryVO) {
+ Sale sale = saleQueryVO.getSale();
+ List saleDetailList = saleQueryVO.getSaleDetailList();
+ boolean result = saleService.updateById(sale);
+ if(result) {
+ QueryWrapper deleteWrapper = new QueryWrapper<>();
+ deleteWrapper.eq("sale_id",sale.getId());
+ boolean removeBatchByIds = saleDetailService.remove(deleteWrapper);
+ if (removeBatchByIds){
+ return saleDetailService.saveBatch(saleDetailList)?ResultUtil.success("修改成功"):ResultUtil.error("修改失败");
+ }
+ }
+ return ResultUtil.error("修改失败");
+ }
+
+ @RequestMapping(value = "/delById", method = RequestMethod.POST)
+ @ApiOperation(value = "根据id删除订单")
+ public Result delete(Sale sale) {
+ boolean result = saleService.removeById(sale);
+ if(result) {
+ QueryWrapper deleteWrapper = new QueryWrapper<>();
+ deleteWrapper.eq("sale_id",sale.getId());
+ boolean removeBatchByIds = saleDetailService.remove(deleteWrapper);
+ if (removeBatchByIds){
+ return ResultUtil.success("删除成功");
+ }
+ }
+ return ResultUtil.error("删除失败");
+ }
+
+ @RequestMapping(value = "/list", method = RequestMethod.POST)
+ @ApiOperation(value = "根据条件获得分页")
+ public Result> queryAll(SaleVO saleVO) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ if (!ObjectUtils.isEmpty(saleVO)){
+ if (ObjectUtils.isEmpty(saleVO.getPayStatus())) queryWrapper.eq("pay_status",saleVO.getPayStatus());
+ if (StringUtils.isEmpty(saleVO.getStatus())) queryWrapper.eq("status",saleVO.getStatus());
+ if (StringUtils.isEmpty(saleVO.getTransportType())) queryWrapper.eq("transport_type",saleVO.getTransportType());
+ }
+ List saleList = saleService.list(queryWrapper);
+ return new ResultUtil>().setData(saleList);
+ }
+
+ @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
+ @ApiOperation(value = "获得订单详情")
+ public Result get(@PathVariable String id) {
+ SaleQueryVO saleQueryVO = new SaleQueryVO();
+ Sale sale = saleService.getById(id);
+ saleQueryVO.setSale(sale);
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("sale_id",id);
+ List saleDetailList = saleDetailService.list(queryWrapper);
+ saleQueryVO.setSaleDetailList(saleDetailList);
+ return new ResultUtil().setData(saleQueryVO);
+ }
+
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java
index 0b72aeed..e1e86046 100644
--- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java
@@ -12,7 +12,7 @@ import java.util.Date;
@ApiModel(value = "销售单主表")
@TableName(value = "t_sale", autoResultMap = true)
public class Sale implements Serializable {
- private String id = SnowFlakeUtil.nextId().toString();
+ private String id = "XD" + SnowFlakeUtil.nextId().toString();
private String createBy;
@@ -48,13 +48,13 @@ public class Sale implements Serializable {
@ApiModelProperty(value = "未收")
private BigDecimal noEarn;
- @ApiModelProperty(value = "收款状态 0-未收款 1-已收款")
+ @ApiModelProperty(value = "收款状态 0-未收款 1-已收款 2-部分收款")
private String payStatus;
- @ApiModelProperty(value = "订单状态 0-拣货中 1-已提交抢单 2-已取货 3-已送达")
+ @ApiModelProperty(value = "订单状态 1-拣货中 2-已预定 3-已作废 4-已取货 5-已送达")
private String status;
- @ApiModelProperty(value = "物流类别 0-物流 1-快递 2-自提 3-拼单")
+ @ApiModelProperty(value = "物流类别 1-物流 2-自提 3-快递 4-拼单")
private String transportType;
@ApiModelProperty(value = "拼单店铺地址 为拼单类别时手动输入")
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleDTO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleDTO.java
new file mode 100644
index 00000000..d1374354
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleDTO.java
@@ -0,0 +1,29 @@
+package cc.hiver.mall.pojo.dto;
+
+import cc.hiver.mall.entity.Sale;
+import cc.hiver.mall.entity.SaleDetail;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@ApiModel(value = "销售单主表")
+@Data
+public class SaleDTO implements Serializable {
+
+ @ApiModelProperty(value = "订单")
+ private Sale sale;
+
+ @ApiModelProperty(value = "订单明细")
+ private List saleDetailList;
+
+
+ @ApiModelProperty(value = "扛包工编号")
+ private String orderByWorker;
+
+ @ApiModelProperty(value = "物流公司编号")
+ private String transCompany;
+
+}
\ No newline at end of file
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MessageVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MessageVO.java
new file mode 100644
index 00000000..bc2b6e68
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MessageVO.java
@@ -0,0 +1,15 @@
+package cc.hiver.mall.pojo.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+@ApiModel(value = "消息推送实体")
+public class MessageVO implements Serializable {
+ @ApiModelProperty(value = "客户端标识")
+ private String registrationId;
+
+ @ApiModelProperty(value = "消息内容")
+ private String message;
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleQueryVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleQueryVO.java
new file mode 100644
index 00000000..33750c3e
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleQueryVO.java
@@ -0,0 +1,22 @@
+package cc.hiver.mall.pojo.vo;
+
+import cc.hiver.mall.entity.Sale;
+import cc.hiver.mall.entity.SaleDetail;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@ApiModel(value = "销售单主表")
+@Data
+public class SaleQueryVO implements Serializable {
+
+ @ApiModelProperty(value = "订单")
+ private Sale sale;
+
+ @ApiModelProperty(value = "订单明细")
+ private List saleDetailList;
+
+}
\ No newline at end of file
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleVO.java
new file mode 100644
index 00000000..4fe6f5d1
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleVO.java
@@ -0,0 +1,28 @@
+package cc.hiver.mall.pojo.vo;
+
+import cc.hiver.mall.entity.SaleDetail;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+@Data
+@ApiModel(value = "销售单主表")
+public class SaleVO implements Serializable {
+
+ @ApiModelProperty(value = "收款状态 0-未收款 1-已收款 2-部分收款")
+ private String payStatus;
+
+ @ApiModelProperty(value = "订单状态 1-未预定 2-已预定 3-待自提 4-已取货 5-已送达")
+ private String status;
+
+ @ApiModelProperty(value = "物流类别 1-物流 2-快递 3-自提 4-拼单")
+ private String transportType;
+
+
+
+
+}
\ No newline at end of file
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/RushOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/RushOrderService.java
new file mode 100644
index 00000000..4f5c8605
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/RushOrderService.java
@@ -0,0 +1,9 @@
+package cc.hiver.mall.service;
+
+import cc.hiver.mall.pojo.dto.SaleDTO;
+
+public interface RushOrderService {
+
+ void handleRushOrder(SaleDTO saleDTO);
+
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/SalesAndDetailsService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/SalesAndDetailsService.java
new file mode 100644
index 00000000..91c97381
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/SalesAndDetailsService.java
@@ -0,0 +1,13 @@
+package cc.hiver.mall.service;
+
+import cc.hiver.mall.entity.Sale;
+import cc.hiver.mall.pojo.dto.SaleDTO;
+import cc.hiver.mall.pojo.vo.SaleVO;
+
+public interface SalesAndDetailsService {
+
+ public Sale handleSalesAndDetails(SaleDTO saleDTO);
+
+ public Sale handleBackSalesAndDetails(SaleDTO saleDTO);
+
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/SendMessageService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/SendMessageService.java
new file mode 100644
index 00000000..0d6f66e2
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/SendMessageService.java
@@ -0,0 +1,9 @@
+package cc.hiver.mall.service;
+
+public interface SendMessageService {
+
+ void handleSendAppMessage();
+
+ void handleSendWXMessage();
+
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/StockAndLogService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/StockAndLogService.java
new file mode 100644
index 00000000..fb77d744
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/StockAndLogService.java
@@ -0,0 +1,15 @@
+package cc.hiver.mall.service;
+
+import cc.hiver.mall.entity.SaleDetail;
+
+import java.util.List;
+
+public interface StockAndLogService {
+
+ //出
+ void handleSubStockAndLog(List saleDetailList);
+
+ //入
+ void handleIncStockAndLog(List saleDetailList);
+
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleDetailService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleDetailService.java
new file mode 100644
index 00000000..e90c8d4e
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleDetailService.java
@@ -0,0 +1,10 @@
+package cc.hiver.mall.service.mybatis;
+
+import cc.hiver.mall.entity.SaleDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface SaleDetailService extends IService {
+
+
+
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java
new file mode 100644
index 00000000..5394a03c
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java
@@ -0,0 +1,41 @@
+package cc.hiver.mall.serviceimpl;
+
+import cc.hiver.mall.entity.OrderXd;
+import cc.hiver.mall.entity.Sale;
+import cc.hiver.mall.pojo.dto.SaleDTO;
+import cc.hiver.mall.service.OrderService;
+import cc.hiver.mall.service.RushOrderService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RushOrderServiceImpl implements RushOrderService {
+
+ @Autowired
+ OrderService orderService;
+
+ @Override
+ public void handleRushOrder(SaleDTO saleDTO) {
+ /**
+ * 根据销售单推入至抢单表
+ * */
+ Sale sale = saleDTO.getSale();
+ OrderXd orderXd = new OrderXd();
+ orderXd.setOrderId(sale.getId());
+ orderXd.setOrderLogistics(sale.getTransportType());
+ orderXd.setOrderAddress(sale.getProvince()+","+sale.getCity()+","+sale.getArea());
+ if("4".equals(sale.getTransportType()))
+ orderXd.setOrderStreet(sale.getShareAddress());
+ else
+ orderXd.setOrderStreet(sale.getReceiveAddress());
+ orderXd.setOrderStatus(Integer.valueOf(sale.getStatus()));
+ orderXd.setOrderByWorker(StrUtil.isNotEmpty(saleDTO.getOrderByWorker())? saleDTO.getOrderByWorker() : null);
+ orderXd.setTransCompany(saleDTO.getTransCompany());
+ orderXd.setOrderByWorkertime(sale.getCreateTime());
+ orderXd.setTimeout(2);
+
+ orderService.save(orderXd);
+
+ }
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java
new file mode 100644
index 00000000..50f23298
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java
@@ -0,0 +1,103 @@
+package cc.hiver.mall.serviceimpl;
+
+import cc.hiver.mall.entity.Sale;
+import cc.hiver.mall.entity.SaleDetail;
+import cc.hiver.mall.pojo.dto.SaleDTO;
+import cc.hiver.mall.service.SalesAndDetailsService;
+import cc.hiver.mall.service.mybatis.SaleDetailService;
+import cc.hiver.mall.service.mybatis.SaleService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+public class SalesAndDetailsServiceImpl implements SalesAndDetailsService {
+
+
+ @Autowired
+ SaleService saleService;
+
+ @Autowired
+ SaleDetailService saleDetailService;
+
+ @Override
+ public Sale handleSalesAndDetails(SaleDTO saleDTO) {
+
+ /**
+ * 1.处理Sale总订单
+ * 处理订单状态/收款状态
+ * */
+ Sale sale = saleDTO.getSale();
+
+ BigDecimal realAmount = sale.getRealAmount();
+ BigDecimal alreadyEarn = sale.getAlreadyEarn();
+ if(realAmount.subtract(alreadyEarn).compareTo(BigDecimal.ZERO)>0 && alreadyEarn.compareTo(BigDecimal.ZERO)>0){
+ sale.setPayStatus("2");
+ } else if (realAmount.subtract(alreadyEarn).compareTo(BigDecimal.ZERO)==0){
+ sale.setPayStatus("1");
+ } else {
+ sale.setPayStatus("0");
+ }
+
+ if (StrUtil.isNotBlank(saleDTO.getOrderByWorker())) {
+ sale.setStatus("2");
+ } else {
+ sale.setStatus("1");
+ }
+ saleService.save(sale);
+
+ String saleId = sale.getId();
+ /**
+ * 2.处理SaleDetail明细单
+ * */
+
+ List saleDetailList = saleDTO.getSaleDetailList();
+ for(SaleDetail saleDetail : saleDetailList)
+ saleDetail.setSaleId(saleId);
+ saleDetailService.saveBatch(saleDetailList);
+
+ return sale;
+ }
+
+ @Override
+ public Sale handleBackSalesAndDetails(SaleDTO saleDTO) {
+
+ /**
+ * 1.处理Sale总订单
+ * 处理订单状态/收款状态
+ * */
+ Sale sale = saleDTO.getSale();
+
+ BigDecimal realAmount = sale.getRealAmount();
+ BigDecimal alreadyEarn = sale.getAlreadyEarn();
+ if(realAmount.subtract(alreadyEarn).compareTo(BigDecimal.ZERO)>0 && alreadyEarn.compareTo(BigDecimal.ZERO)>0){
+ sale.setPayStatus("2");
+ } else if (realAmount.subtract(alreadyEarn).compareTo(BigDecimal.ZERO)==0){
+ sale.setPayStatus("1");
+ } else {
+ sale.setPayStatus("0");
+ }
+
+ if (StrUtil.isNotBlank(saleDTO.getOrderByWorker())) {
+ sale.setStatus("2");
+ } else {
+ sale.setStatus("1");
+ }
+ saleService.save(sale);
+
+ String saleId = sale.getId();
+ /**
+ * 2.处理SaleDetail明细单
+ * */
+
+ List saleDetailList = saleDTO.getSaleDetailList();
+ for(SaleDetail saleDetail : saleDetailList)
+ saleDetail.setSaleId(saleId);
+ saleDetailService.saveBatch(saleDetailList);
+
+ return sale;
+ }
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SendMessageServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SendMessageServiceImpl.java
new file mode 100644
index 00000000..1140c364
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SendMessageServiceImpl.java
@@ -0,0 +1,25 @@
+package cc.hiver.mall.serviceimpl;
+
+import cc.hiver.core.service.JPushService;
+import cc.hiver.mall.service.SendMessageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SendMessageServiceImpl implements SendMessageService {
+
+ @Autowired
+ JPushService jPushService;
+
+ @Override
+ public void handleSendAppMessage() {
+ String registrationId = "";
+ String message = "宝贝儿,来订单了";
+ jPushService.sendPushNotification(registrationId, message);
+ }
+
+ @Override
+ public void handleSendWXMessage() {
+
+ }
+}
diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/StockAndLogServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/StockAndLogServiceImpl.java
new file mode 100644
index 00000000..d625f6b2
--- /dev/null
+++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/StockAndLogServiceImpl.java
@@ -0,0 +1,95 @@
+package cc.hiver.mall.serviceimpl;
+
+import cc.hiver.core.common.utils.BeanUtils;
+import cc.hiver.mall.entity.SaleDetail;
+import cc.hiver.mall.entity.Stock;
+import cc.hiver.mall.entity.StockLog;
+import cc.hiver.mall.service.StockAndLogService;
+import cc.hiver.mall.service.mybatis.SaleDetailService;
+import cc.hiver.mall.service.mybatis.StockLogService;
+import cc.hiver.mall.service.mybatis.StockService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class StockAndLogServiceImpl implements StockAndLogService {
+
+ @Autowired
+ StockService stockService;
+
+ @Autowired
+ StockLogService stockLogService;
+
+ @Autowired
+ SaleDetailService saleDetailService;
+
+ @Override
+ public void handleSubStockAndLog(List saleDetailList) {
+
+ //根据销售单明细进行库存消减
+ for(SaleDetail saleDetail : saleDetailList){
+ String productId = saleDetail.getProductId();
+ String attributeList = saleDetail.getAttributeList();
+ QueryWrapper stockQueryWrapper = new QueryWrapper<>();
+ stockQueryWrapper.eq("product_id",productId);
+ stockQueryWrapper.eq("attribute_list",attributeList);
+ //存在库存则修改库存数量
+ Stock origin = stockService.getOne(stockQueryWrapper);
+ Integer stockCount = origin.getStockCount();
+ UpdateWrapper updateWrapper = new UpdateWrapper<>();
+ updateWrapper.eq("id",origin.getId());
+ updateWrapper.set("stock_count",stockCount - saleDetail.getProductCount());
+ stockService.update(updateWrapper);
+
+ //2.记录库存履历
+ StockLog stockLog = new StockLog();
+ stockLog.setChangeType("1");//出库
+ stockLog.setProductId(saleDetail.getProductId());
+ stockLog.setProductSpecs(saleDetail.getAttributeList());
+ stockLog.setStock(stockCount);//出库前数量
+ stockLog.setChangeStock(saleDetail.getProductCount());//出库数量
+ stockLog.setPrice(saleDetail.getPrice());
+ stockLog.setPurchasePrice(saleDetail.getPurchasePrice());
+ stockLog.setWholesalePrice(saleDetail.getWholesalePrice());
+ stockLog.setShopId(saleDetail.getShopId());
+ stockLogService.save(stockLog);
+ }
+
+ }
+
+ @Override
+ public void handleIncStockAndLog(List saleDetailList) {
+ //根据销售单明细进行库存消减
+ for(SaleDetail saleDetail : saleDetailList){
+ String productId = saleDetail.getProductId();
+ String attributeList = saleDetail.getAttributeList();
+ QueryWrapper stockQueryWrapper = new QueryWrapper<>();
+ stockQueryWrapper.eq("product_id",productId);
+ stockQueryWrapper.eq("attribute_list",attributeList);
+ //存在库存则修改库存数量
+ Stock origin = stockService.getOne(stockQueryWrapper);
+ Integer stockCount = origin.getStockCount();
+ UpdateWrapper updateWrapper = new UpdateWrapper<>();
+ updateWrapper.eq("id",origin.getId());
+ updateWrapper.set("stock_count",stockCount + saleDetail.getProductCount());
+ stockService.update(updateWrapper);
+
+ //2.记录库存履历
+ StockLog stockLog = new StockLog();
+ stockLog.setChangeType("0");//退货-入库
+ stockLog.setProductId(saleDetail.getProductId());
+ stockLog.setProductSpecs(saleDetail.getAttributeList());
+ stockLog.setStock(stockCount);//退货-入库前数量
+ stockLog.setChangeStock(saleDetail.getProductCount());//退货-入库数量
+ stockLog.setPrice(saleDetail.getPrice());
+ stockLog.setPurchasePrice(saleDetail.getPurchasePrice());
+ stockLog.setWholesalePrice(saleDetail.getWholesalePrice());
+ stockLog.setShopId(saleDetail.getShopId());
+ stockLogService.save(stockLog);
+ }
+ }
+}