This commit is contained in:
clunt 2022-05-26 10:38:36 +08:00
commit 604e7bc703
17 changed files with 309 additions and 12 deletions

View File

@ -8,8 +8,10 @@ import com.ghy.customer.service.CustomerService;
import com.ghy.goods.domain.Goods;
import com.ghy.goods.request.AppGoodsRequest;
import com.ghy.goods.service.GoodsService;
import com.ghy.order.domain.OrderDetail;
import com.ghy.order.domain.OrderGoods;
import com.ghy.order.domain.OrderMaster;
import com.ghy.order.request.AppOrderAssignRequest;
import com.ghy.order.request.AppOrderRequest;
import com.ghy.order.service.OrderDetailService;
import com.ghy.order.service.OrderGoodsService;
@ -18,8 +20,11 @@ import com.ghy.payment.domain.FinancialDetail;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.service.FinancialDetailService;
import com.ghy.payment.service.FinancialMasterService;
import com.ghy.worker.domain.Worker;
import com.ghy.worker.service.WorkerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -48,6 +53,9 @@ public class OrderController extends BaseController {
@Autowired
private GoodsService goodsService;
@Autowired
private WorkerService workerService;
@Autowired
private OrderMasterService orderMasterService;
@ -63,9 +71,81 @@ public class OrderController extends BaseController {
@Autowired
private FinancialDetailService financialDetailService;
@PostMapping("/assign")
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public AjaxResult assign(@RequestBody AppOrderAssignRequest request) {
OrderMaster om = orderMasterService.selectById(request.getOrderMasterId());
Assert.notNull(om, "订单不存在");
FinancialMaster fm = financialMasterService.selectByOrderMasterId(om.getId());
Assert.notNull(fm, "找不到对应的订单");
// 派单师傅
Worker assignWorker = workerService.selectById(om.getWorkerId());
Assert.notNull(assignWorker, "找不到师傅信息");
// 接单师傅
Worker acceptWorker = workerService.selectById(request.getWorkerId());
Assert.notNull(acceptWorker, "查询接单师傅信息失败");
// 校验接单师傅和派单师傅是不是同一个Team
boolean checkInTeam = workerService.checkInTeam(assignWorker.getWorkerId(), acceptWorker.getWorkerId());
Assert.isTrue(checkInTeam, "找不到接单师傅信息");
// 创建子订单
OrderDetail od = new OrderDetail();
od.setDeptId(om.getDeptId());
od.setCode(orderDetailService.createCode());
od.setOrderMasterId(om.getId());
od.setOrderMasterCode(om.getCode());
od.setCustomerId(om.getCustomerId());
od.setOrderType(om.getOrderType());
od.setOrderStatus(om.getOrderStatus());
od.setWorkerId(request.getWorkerId());
od.setRevTime(new Date());
orderDetailService.insertOrderDetail(od);
String leaderTeamMoney = assignWorker.getLeaderTeamMoney();
String leaderTeamRate = assignWorker.getLeaderTeamRate();
// 派单师傅的钱
BigDecimal assignWorkerMoney;
// 接单师傅的钱
BigDecimal acceptWorkerMoney;
if (StringUtils.isNotBlank(leaderTeamMoney)) {
assignWorkerMoney = new BigDecimal(leaderTeamMoney);
} else if (StringUtils.isNotBlank(leaderTeamRate)) {
BigDecimal rate = new BigDecimal(leaderTeamRate);
assignWorkerMoney = rate.multiply(fm.getPayMoney());
} else {
assignWorkerMoney = BigDecimal.ZERO;
}
// 如果派单师傅的抽成金额>0 则为派单师傅生成子财务单
if (BigDecimal.ZERO.compareTo(assignWorkerMoney) < 0) {
FinancialDetail fd = new FinancialDetail(fm.getDeptId(), financialDetailService.createCode(), fm.getId(),
fm.getCode(), od.getId(), od.getCode(), assignWorkerMoney, 1, assignWorker.getWorkerId(),
fm.getPayType(), fm.getPayStatus(), fm.getPayTime());
financialDetailService.insertFinancialDetail(fd);
}
// 减掉派单师傅的抽成
acceptWorkerMoney = fm.getPayMoney().subtract(assignWorkerMoney);
List<FinancialDetail> fds = financialDetailService.selectFinancialDetailList(new FinancialDetail(fm.getId()));
// 减掉所有的平台和分销抽成
for (FinancialDetail fd : fds) {
acceptWorkerMoney = acceptWorkerMoney.subtract(fd.getPayMoney());
}
Assert.isTrue(BigDecimal.ZERO.compareTo(acceptWorkerMoney) < 0, "订单计算出错 请联系管理员");
//为接单师傅生成子财务单
FinancialDetail fd = new FinancialDetail(fm.getDeptId(), financialDetailService.createCode(), fm.getId(),
fm.getCode(), od.getId(), od.getCode(), acceptWorkerMoney, 1, acceptWorker.getWorkerId(),
fm.getPayType(), fm.getPayStatus(), fm.getPayTime());
financialDetailService.insertFinancialDetail(fd);
return AjaxResult.success();
}
@PostMapping("/server/app")
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public AjaxResult appOrder(@RequestBody AppOrderRequest appOrderRequest) {
// 校验用户信息
Customer customer = customerService.selectByCustomerId(appOrderRequest.getCustomerId());

View File

@ -18,6 +18,9 @@ public class OrderDetail extends BaseEntity {
@Excel(name = "序号", cellType = Excel.ColumnType.NUMERIC)
private Long id;
@Excel(name = "商户ID", cellType = Excel.ColumnType.NUMERIC)
private Long deptId;
@Excel(name = "订单编码", cellType = Excel.ColumnType.STRING)
private String code;
@ -37,7 +40,7 @@ public class OrderDetail extends BaseEntity {
private Integer orderStatus;
@Excel(name = "接单师傅id", cellType = Excel.ColumnType.NUMERIC)
private Integer workerId;
private Long workerId;
@Excel(name = "接单时间", cellType = Excel.ColumnType.STRING)
private Date revTime;

View File

@ -40,7 +40,7 @@ public class OrderMaster extends BaseEntity {
private Integer payStatus;
@Excel(name = "接单师傅id", cellType = Excel.ColumnType.NUMERIC)
private Integer workerId;
private Long workerId;
@Excel(name = "付款时间", cellType = Excel.ColumnType.STRING)
private Date payTime;

View File

@ -0,0 +1,24 @@
package com.ghy.order.request;
import com.ghy.goods.request.AppGoodsRequest;
import lombok.Data;
import java.util.List;
/**
* 订单分配接口请求参数
*
* @author HH 2022/5/25
*/
@Data
public class AppOrderAssignRequest {
// 主订单ID
private Long orderMasterId;
// 接受分配的师傅ID
private Long workerId;
// 分配的商品及数量
private List<AppGoodsRequest> goodsList;
}

View File

@ -49,4 +49,10 @@ public interface OrderDetailService {
* @return 校验结果 1存在 0不存在
*/
String checkOrderDetailCodeUnique(OrderDetail orderDetail);
/**
* 创建code
*/
String createCode();
}

View File

@ -8,11 +8,25 @@ import com.ghy.order.service.OrderDetailService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import static java.time.temporal.ChronoField.*;
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
@Service
public class OrderDetailServiceImpl implements OrderDetailService {
private static final AtomicLong INDEX = new AtomicLong(1L);
public static final DateTimeFormatter MINI_FORMATTER = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4).appendValue(MONTH_OF_YEAR, 2)
.appendValue(DAY_OF_MONTH, 2).appendValue(HOUR_OF_DAY, 2)
.appendValue(MINUTE_OF_HOUR, 2).appendValue(SECOND_OF_MINUTE, 2).toFormatter();
@Resource
private OrderDetailMapper orderDetailMapper;
@ -51,4 +65,11 @@ public class OrderDetailServiceImpl implements OrderDetailService {
}
return UserConstants.ORDER_CODE_UNIQUE;
}
@Override
public String createCode() {
INDEX.compareAndSet(9999L, 1L);
LocalDateTime now = LocalDateTime.now();
return "od" + now.format(MINI_FORMATTER) + INDEX.getAndIncrement();
}
}

View File

@ -5,6 +5,7 @@ import com.ghy.common.core.domain.BaseEntity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author clunt
@ -64,11 +65,15 @@ public class FinancialDetail extends BaseEntity {
private Integer payStatus;
@Excel(name = "付款时间", cellType = Excel.ColumnType.STRING)
private String payTime;
private Date payTime;
public FinancialDetail() {
}
public FinancialDetail(Long financialMasterId) {
this.financialMasterId = financialMasterId;
}
public FinancialDetail(String code, Long deptId, Long financialMasterId, String financialMasterCode, BigDecimal payMoney, Integer financialDetailType, Long payeeId) {
this.deptId = deptId;
this.code = code;
@ -78,4 +83,19 @@ public class FinancialDetail extends BaseEntity {
this.financialDetailType = financialDetailType;
this.payeeId = payeeId;
}
public FinancialDetail(Long deptId, String code, Long financialMasterId, String financialMasterCode, Long orderDetailId, String orderDetailCode, BigDecimal payMoney, Integer financialDetailType, Long payeeId, Integer payType, Integer payStatus, Date payTime) {
this.deptId = deptId;
this.code = code;
this.financialMasterId = financialMasterId;
this.financialMasterCode = financialMasterCode;
this.orderDetailId = orderDetailId;
this.orderDetailCode = orderDetailCode;
this.payMoney = payMoney;
this.financialDetailType = financialDetailType;
this.payeeId = payeeId;
this.payType = payType;
this.payStatus = payStatus;
this.payTime = payTime;
}
}

View File

@ -50,4 +50,11 @@ public interface FinancialMasterMapper {
* @param payType 支付渠道
*/
void paySucceeded(String orderNo, int payType);
/**
* 用主订单ID查询主财务单
*
* @param orderMasterId 主订单ID
*/
FinancialMaster selectByOrderMasterId(Long orderMasterId);
}

View File

@ -54,4 +54,11 @@ public interface FinancialMasterService {
* 创建主财务单CODE
*/
String createCode();
/**
* 用主订单ID查询主财务单
*
* @param orderMasterId 主订单ID
*/
FinancialMaster selectByOrderMasterId(Long orderMasterId);
}

View File

@ -90,4 +90,9 @@ public class FinancialMasterServiceImpl implements FinancialMasterService {
return "fm" + now.format(MINI_FORMATTER) + INDEX.getAndIncrement();
}
@Override
public FinancialMaster selectByOrderMasterId(Long orderMasterId) {
return financialMasterMapper.selectByOrderMasterId(orderMasterId);
}
}

View File

@ -48,12 +48,11 @@
</select>
<select id="selectById" parameterType="long" resultMap="FinancialMasterResult">
<include refid="selectFinancialMaster"/>
<where>
<if test="financialMasterId != null and financialMasterId != 0">
AND id = #{financialMasterId}
</if>
</where>
<include refid="selectFinancialMaster"/> WHERE id = #{financialMasterId}
</select>
<select id="selectByOrderMasterId" parameterType="long" resultMap="FinancialMasterResult">
<include refid="selectFinancialMaster"/> WHERE order_master_id = #{orderMasterId}
</select>
<delete id="deleteFinancialMasterByIds" parameterType="Long">

View File

@ -24,4 +24,10 @@ public interface WorkerMapper {
*/
int updateWorker(Worker worker);
/**
* 用师傅ID查询
*
* @param workerId 师傅ID
*/
Worker selectById(Long workerId);
}

View File

@ -0,0 +1,26 @@
package com.ghy.worker.mapper;
import com.ghy.worker.domain.WorkerTeam;
import java.util.List;
public interface WorkerTeamMapper {
/**
* @param workerTeam 师傅团队
* @return 师傅团队集合
*/
List<WorkerTeam> getWorkerTeamList(WorkerTeam workerTeam);
/**
* @param workerTeam 师傅团队信息
* @return 新增成功条数
*/
int insertWorkerTeam(WorkerTeam workerTeam);
/**
* @param ids 师傅团队ID
* @return 更新成功条数
*/
int deleteWorkerTeamByIds(Long[] ids);
}

View File

@ -30,4 +30,18 @@ public interface WorkerService {
*/
int updateWorker(Worker worker);
/**
* 用师傅ID查询
*
* @param workerId 师傅ID
*/
Worker selectById(Long workerId);
/**
* 校验成员与leader是否在同一个团队
*
* @param leaderId leaderId
* @param workerId workerId
*/
boolean checkInTeam(Long leaderId, Long workerId);
}

View File

@ -2,10 +2,12 @@ package com.ghy.worker.service.impl;
import com.ghy.common.utils.StringUtils;
import com.ghy.worker.domain.Worker;
import com.ghy.worker.domain.WorkerTeam;
import com.ghy.worker.mapper.WorkerMapper;
import com.ghy.worker.mapper.WorkerTeamMapper;
import com.ghy.worker.service.WorkerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
@ -15,6 +17,8 @@ public class WorkerServiceImpl implements WorkerService {
@Resource
private WorkerMapper workerMapper;
@Resource
private WorkerTeamMapper workerTeamMapper;
@Override
public List<Worker> getWorkList(Worker worker) {
@ -40,4 +44,18 @@ public class WorkerServiceImpl implements WorkerService {
public int updateWorker(Worker worker) {
return workerMapper.updateWorker(worker);
}
@Override
public Worker selectById(Long workerId) {
return workerMapper.selectById(workerId);
}
@Override
public boolean checkInTeam(Long leaderId, Long workerId) {
WorkerTeam query = new WorkerTeam();
query.setLeaderId(leaderId);
query.setWorkerId(workerId);
List<WorkerTeam> teams = workerTeamMapper.getWorkerTeamList(query);
return !CollectionUtils.isEmpty(teams);
}
}

View File

@ -39,6 +39,10 @@
</where>
</select>
<select id="selectById" parameterType="Long" resultMap="WorkerResult">
<include refid="selectWorker" /> WHERE worker_id = #{workerId}
</select>
<insert id="insertWorker" parameterType="com.ghy.worker.domain.Worker" useGeneratedKeys="true" keyProperty="workerId">
insert into worker(
<if test="name != null and name != ''">name,</if>

View File

@ -0,0 +1,57 @@
<?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.ghy.worker.mapper.WorkerTeamMapper">
<resultMap id="WorkerTeamResult" type="com.ghy.worker.domain.WorkerTeam">
<id property="workerTeamId" column="worker_team_id"/>
<result property="leaderId" column="leader_id"/>
<result property="workerId" column="worker_id"/>
<result property="workerName" column="worker_name"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
<insert id="insertWorkerTeam" parameterType="com.ghy.worker.domain.WorkerTeam" useGeneratedKeys="true"
keyProperty="workerTeamId">
INSERT INTO worker_team(
<if test="leaderId != null and leaderId != 0">leader_id,</if>
<if test="workerId != null and workerId != 0">worker_id,</if>
<if test="workerName != null and workerName != ''">worker_name,</if>
<if test="remark != null and remark != ''">remark,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
create_time
)values(
<if test="leaderId != null and leaderId != 0">#{leaderId},</if>
<if test="workerId != null and workerId != 0">#{workerId},</if>
<if test="workerName != null and workerName != ''">#{workerName},</if>
<if test="remark != null and remark != ''">#{remark},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
sysdate()
)
</insert>
<sql id="selectWorkerTeam">
SELECT *
FROM worker_team
</sql>
<select id="getWorkerTeamList" resultMap="WorkerTeamResult">
<include refid="selectWorkerTeam"/>
<where>
<if test="leaderId != null and leaderId != ''">
AND leader_id = #{leaderId}
</if>
</where>
</select>
<delete id="deleteWorkerTeamByIds" parameterType="Long">
DELETE FROM worker_team WHERE worker_team_id IN
<foreach collection="array" item="workerTeamId" open="(" separator="," close=")">
#{workerTeamId}
</foreach>
</delete>
</mapper>