订单创建

master
ljw 2025-12-20 17:41:48 +08:00
parent c6385f4c06
commit fb4ed3c5a3
16 changed files with 403 additions and 45 deletions

View File

@ -0,0 +1,24 @@
package com.njzscloud.dispose.cst.order.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* check_status
*
*/
@Getter
@RequiredArgsConstructor
public enum CheckStatus implements DictStr {
Wu("Wu", "无需勘料"),
YiKanLiao("YiKanLiao", "已勘料"),
WeiKanLiao("WeiKanLiao", "未勘料"),
;
private final String val;
private final String txt;
}

View File

@ -0,0 +1,26 @@
package com.njzscloud.dispose.cst.order.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* payment_status
*
*/
@Getter
@RequiredArgsConstructor
public enum PaymentStatus implements DictStr {
MianFei("MianFei", "免费"),
WeiZhiFu("WeiZhiFu", "未支付"),
YiZhiFu("YiZhiFu", "已支付"),
YiTuiKuan("YiTuiKuan", "已退款"),
;
private final String val;
private final String txt;
}

View File

@ -0,0 +1,24 @@
package com.njzscloud.dispose.cst.order.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* settlement_way
*
*/
@Getter
@RequiredArgsConstructor
public enum SettlementWay implements DictStr {
YueJie("YueJie", "月结"),
YuE("YuE", "余额"),
XianFu("XianFu", "现付"),
;
private final String val;
private final String txt;
}

View File

@ -0,0 +1,34 @@
package com.njzscloud.dispose.cst.order.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* trans_status
*
*/
@Getter
@RequiredArgsConstructor
public enum TransStatus implements DictStr {
DaiPaiDan("DaiPaiDan", "待派单"),
DaiJieDan("DaiJieDan", "待接单"),
YiJieDan("YiJieDan", "已接单"),
YunShuZhong("YunShuZhong", "运输中"),
YiJinChang("YiJinChang", "已进场"),
YiChuChang("YiChuChang", "已出场"),
YiWanCheng("YiWanCheng", "已完成"),
YiQuXiao("YiQuXiao", "已取消"),
;
private final String val;
private final String txt;
}

View File

@ -0,0 +1,22 @@
package com.njzscloud.dispose.cst.order.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* zx
* /
*/
@Getter
@RequiredArgsConstructor
public enum Zx implements DictStr {
ZhuangHuo("ZhuangHuo", "装货地址"),
XieHuo("XieHuo", "卸货地址"),
;
private final String val;
private final String txt;
}

View File

@ -4,6 +4,7 @@ import com.njzscloud.common.core.utils.R;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.dispose.cst.order.pojo.entity.OrderEntity;
import com.njzscloud.dispose.cst.order.pojo.param.CreateOrderParam;
import com.njzscloud.dispose.cst.order.service.OrderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -13,6 +14,7 @@ import java.util.List;
/**
* /
*
* @author ljw
*/
@Slf4j
@ -27,8 +29,8 @@ public class OrderController {
*
*/
@PostMapping("/add")
public R<?> add(@RequestBody OrderEntity orderEntity) {
orderService.add(orderEntity);
public synchronized R<?> add(@RequestBody CreateOrderParam param) {
orderService.add(param);
return R.success();
}

View File

@ -7,11 +7,11 @@ import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* /
*
* @author ljw
*/
@Getter
@ -84,7 +84,7 @@ public class OrderEntity extends BaseEntity {
/**
*
*/
private BigDecimal assignmentTransTime;
private LocalDateTime assignmentTransTime;
/**
* Idcst_station.id

View File

@ -32,11 +32,6 @@ public class OrderTransEntity extends BaseEntity {
*/
private Long orderId;
/**
* Id
*/
private Long stationId;
/**
* trans_statusDaiPaiDan-->DaiJieDan-->YiJieDan-->YunShuZhong-->YiJinChang-->YiChuChang-->YiWanCheng-->YiQuXiao-->
*/

View File

@ -0,0 +1,67 @@
package com.njzscloud.dispose.cst.order.pojo.param;
import lombok.Data;
/**
* /
*
* @author ljw
*/
@Data
public class CreateOrderCargoPlaceParam {
/**
*
*/
private String province;
/**
*
*/
private String city;
/**
*
*/
private String area;
/**
*
*/
private String town;
/**
*
*/
private String provinceName;
/**
*
*/
private String cityName;
/**
*
*/
private String areaName;
/**
*
*/
private String townName;
/**
*
*/
private String address;
/**
*
*/
private Double lng;
/**
*
*/
private Double lat;
}

View File

@ -1,11 +1,7 @@
package com.njzscloud.dispose.cst.order.pojo.param;
import com.njzscloud.dispose.common.pojo.entity.BaseEntity;
import com.njzscloud.dispose.cst.project.pojo.entity.ProjectEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
@ -15,29 +11,13 @@ import java.time.LocalDateTime;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CreateOrderParamEntity extends BaseEntity {
/**
*
*/
private String sn;
public class CreateOrderParam {
/**
* Id
*/
private Long projectId;
/**
* Idsys_user.id
*/
private Long userId;
/**
* Idcst_customer.id
*/
private Long customerId;
/**
*
*/
@ -48,11 +28,6 @@ public class CreateOrderParamEntity extends BaseEntity {
*/
private String phone;
/**
*
*/
private LocalDateTime orderTime;
/**
* order_categoryHuiShouYuYue-->XiaoShouYuYue-->DuanBoRu-->DuanBoChu-->
*/
@ -81,7 +56,7 @@ public class CreateOrderParamEntity extends BaseEntity {
/**
*
*/
private BigDecimal assignmentTransTime;
private LocalDateTime assignmentTransTime;
/**
* Idcst_station.id
@ -129,9 +104,9 @@ public class CreateOrderParamEntity extends BaseEntity {
private String customerMemo;
/**
*
*
*/
private ProjectEntity projectInfo;
private CreateOrderCargoPlaceParam cargoPlaceParam;
}

View File

@ -0,0 +1,22 @@
package com.njzscloud.dispose.cst.order.pojo.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.njzscloud.common.mp.support.handler.j.JsonTypeHandler;
import lombok.Data;
import java.util.List;
/**
* @author ljw
* @apiNote
* @date 2025/12/20
*/
@Data
public class Scope {
private String strategy;
@TableField(typeHandler = JsonTypeHandler.class)
private List<Long> ids;
}

View File

@ -4,16 +4,18 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.dispose.cst.order.pojo.entity.OrderEntity;
import com.njzscloud.dispose.cst.order.pojo.param.CreateOrderParam;
import java.util.List;
/**
* /
*
* @author ljw
*/
public interface OrderService extends IService<OrderEntity> {
void add(OrderEntity orderEntity);
void add(CreateOrderParam param);
void modify(OrderEntity orderEntity);

View File

@ -1,21 +1,42 @@
package com.njzscloud.dispose.cst.order.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njzscloud.common.core.fastjson.Fastjson;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.common.security.util.SecurityUtil;
import com.njzscloud.common.sn.support.SnUtil;
import com.njzscloud.dispose.cst.order.constant.*;
import com.njzscloud.dispose.cst.order.mapper.OrderMapper;
import com.njzscloud.dispose.cst.order.pojo.entity.OrderCargoPlaceEntity;
import com.njzscloud.dispose.cst.order.pojo.entity.OrderEntity;
import com.njzscloud.dispose.cst.order.pojo.entity.OrderExpenseItemsEntity;
import com.njzscloud.dispose.cst.order.pojo.entity.OrderTransEntity;
import com.njzscloud.dispose.cst.order.pojo.param.CreateOrderCargoPlaceParam;
import com.njzscloud.dispose.cst.order.pojo.param.CreateOrderParam;
import com.njzscloud.dispose.cst.order.pojo.vo.Scope;
import com.njzscloud.dispose.cst.order.service.OrderCargoPlaceService;
import com.njzscloud.dispose.cst.order.service.OrderExpenseItemsService;
import com.njzscloud.dispose.cst.order.service.OrderService;
import com.njzscloud.dispose.cst.order.service.OrderTransService;
import com.njzscloud.dispose.finance.constant.ScopeStrategy;
import com.njzscloud.dispose.finance.pojo.entity.ExpenseItemEntity;
import com.njzscloud.dispose.finance.service.ExpenseItemService;
import com.njzscloud.dispose.sys.auth.pojo.result.MyResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
* /
*
* @author ljw
*/
@Slf4j
@ -23,10 +44,56 @@ import java.util.List;
@RequiredArgsConstructor
public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderEntity> implements OrderService {
private final OrderCargoPlaceService orderCargoPlaceService;
private final OrderTransService orderTransService;
private final ExpenseItemService expenseItemService;
private final OrderExpenseItemsService orderExpenseItemsService;
@Override
@Transactional(rollbackFor = Exception.class)
public void add(OrderEntity orderEntity) {
public void add(CreateOrderParam param) {
// 订单信息
param.setOrderStatus(OrderStatus.YiYuYue.getVal());
Long transOrgId = param.getTransOrgId();
OrderStatus orderStatus = transOrgId == null ? OrderStatus.YiYuYue : OrderStatus.JinXingZhong;
MyResult userDetail = SecurityUtil.loginUser();
OrderEntity orderEntity = BeanUtil.copyProperties(param, OrderEntity.class)
.setSn(this.generateSn())
.setUserId(SecurityUtil.currentUserId())
.setCustomerId(userDetail.getCurrentCustomerId())
.setOrderTime(LocalDateTime.now())
.setOrderStatus(orderStatus.getVal())
.setAssignmentTransTime(transOrgId == null ? null : LocalDateTime.now());
this.save(orderEntity);
// 装卸货信息
CreateOrderCargoPlaceParam cargoPlace = param.getCargoPlaceParam();
OrderCargoPlaceEntity placeEntity = BeanUtil.copyProperties(cargoPlace, OrderCargoPlaceEntity.class)
.setOrderId(orderEntity.getId());
if (OrderCategory.HuiShouYuYue.getVal().equals(param.getOrderCategory())) {
placeEntity.setZx(Zx.ZhuangHuo.getVal());
} else if (OrderCategory.XiaoShouYuYue.getVal().equals(param.getOrderCategory())) {
placeEntity.setZx(Zx.XieHuo.getVal());
}
orderCargoPlaceService.add(placeEntity);
// 运输信息
int transNum = orderEntity.getEstimatedTrainNum();
OrderTransEntity transEntity = new OrderTransEntity();
transEntity.setOrderId(orderEntity.getId());
for (int i = 1; i <= transNum; i++) {
transEntity.setTrainNum(i);
transEntity.setTransStatus(transOrgId == null ? null : TransStatus.DaiPaiDan.getVal());
transEntity.setTransTime(transOrgId == null ? null : LocalDateTime.now());
transEntity.setCheckStatus(CheckStatus.WeiKanLiao.getVal());
transEntity.setPaymentStatus(PaymentStatus.WeiZhiFu.getVal());
orderTransService.add(transEntity);
}
// 付费项
if (transOrgId != null) {
this.createOrderExpenseItems(orderEntity);
}
}
@Override
@ -50,6 +117,100 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderEntity> impl
public PageResult<OrderEntity> paging(PageParam pageParam, OrderEntity orderEntity) {
return PageResult.of(this.page(pageParam.toPage(), Wrappers.query(orderEntity)));
}
/**
*
*
* @return sn
*/
public String generateSn() {
String sn = SnUtil.next("Booking-Order-SN");
if (this.exists(Wrappers.<OrderEntity>lambdaQuery().eq(OrderEntity::getSn, sn).eq(OrderEntity::getDeleted, Boolean.FALSE))) {
this.generateSn();
}
return sn;
}
/**
*
*
* @param orderEntity
*/
public void createOrderExpenseItems(OrderEntity orderEntity) {
// 读取启用的付费项配置,并按过滤
List<ExpenseItemEntity> itemEntityList = expenseItemService.list(Wrappers.<ExpenseItemEntity>lambdaQuery()
.eq(ExpenseItemEntity::getCanuse, Boolean.TRUE)
.eq(ExpenseItemEntity::getDeleted, Boolean.FALSE));
Long transOrgId = orderEntity.getTransOrgId();
Long goodsId = orderEntity.getGoodsId();
Long stationId = orderEntity.getStationId();
List<ExpenseItemEntity> goodsItems = itemEntityList.stream().filter(item ->
item.getGoodsId().equals(goodsId)).toList();
OrderExpenseItemsEntity goodsOrderItem = null;
if (!goodsItems.isEmpty()) {
goodsOrderItem = BeanUtil.copyProperties(goodsItems.getFirst(), OrderExpenseItemsEntity.class)
.setOrderId(orderEntity.getId())
.setPaymentStatus(PaymentStatus.WeiZhiFu.getVal());
}
List<OrderExpenseItemsEntity> extraItems = itemEntityList.stream()
.filter(cfg -> {
Scope userScope = Fastjson.toBean(cfg.getUserScope(), Scope.class);
Scope goodsScope = Fastjson.toBean(cfg.getGoodsScope(), Scope.class);
Scope stationsScope = Fastjson.toBean(cfg.getStationScope(), Scope.class);
List<Long> companyIds = userScope != null ? userScope.getIds() : null;
List<Long> goodsIds = goodsScope != null ? goodsScope.getIds() : null;
List<Long> stationsIds = stationsScope != null ? stationsScope.getIds() : null;
// 判断客户范围
boolean isComTrue;
if (userScope != null && ScopeStrategy.SuoYou.getVal().equals(userScope.getStrategy())) {
isComTrue = true; // 所有客户都匹配
} else {
isComTrue = companyIds != null && transOrgId != null && companyIds.contains(transOrgId);
}
// 判断产品范围
boolean isGoodsTrue;
if (goodsScope != null && ScopeStrategy.SuoYou.getVal().equals(goodsScope.getStrategy())) {
isGoodsTrue = true; // 所有产品都匹配
} else {
isGoodsTrue = goodsIds != null && goodsId != null && goodsIds.contains(goodsId);
}
// 判断站点范围
boolean isStationsTrue;
if (stationsScope != null && ScopeStrategy.SuoYou.getVal().equals(stationsScope.getStrategy())) {
isStationsTrue = true; // 所有站点都匹配
} else {
isStationsTrue = stationsIds != null && stationId != null && stationsIds.contains(stationId);
}
// 只有当三个条件都为true时才返回true
return isComTrue && isGoodsTrue && isStationsTrue;
})
// 复制配置为订单付费项(数量口径与产品一致:按车=1否则=settleWeight
.map(cfg -> {
OrderExpenseItemsEntity entity = BeanUtil.copyProperties(cfg, OrderExpenseItemsEntity.class);
entity.setOrderId(orderEntity.getId());
entity.setPaymentStatus(PaymentStatus.WeiZhiFu.getVal());
return entity;
})
.collect(Collectors.toList());
// 第三步:合并集合并计算金额,然后批量落库
if (goodsOrderItem != null) {
extraItems.addFirst(goodsOrderItem);
}
if (extraItems.isEmpty()) {
return;
}
// 批量保存付费项
orderExpenseItemsService.saveBatch(extraItems);
}
}

View File

@ -1,11 +1,13 @@
package com.njzscloud.dispose.finance.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import com.njzscloud.common.core.ienum.DictStr;
/**
* payer
*
*
* @author ljw
*/
@Getter
@ -15,7 +17,7 @@ public enum Payer implements DictStr {
ChanFei("ChanFei", "产废方"),
QingYun("QingYun", "清运方"),
QingYun("YunShuFang", "运输方"),
XiaoNa("XiaoNa", "消纳方"),

View File

@ -1,17 +1,21 @@
package com.njzscloud.dispose.finance.constant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import com.njzscloud.common.core.ienum.DictStr;
/**
* scope_strategy
*
*
* @author ljw
*/
@Getter
@RequiredArgsConstructor
public enum ScopeStrategy implements DictStr {
Wu("Wu", "无"),
ZhiDing("ZhiDing", "指定"),
SuoYou("SuoYou", "所有"),

View File

@ -38,8 +38,6 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, GoodsEntity> impl
expenseItem.setGoodsId(goodsEntity.getId());
expenseItem.setExpenseItemCategory(ExpenseItemCategory.ChanPin.getVal());
expenseItem.setExpenseItemName(goodsEntity.getGoodsName());
// goodsScope默认传{strategy: 'ZhiDing',ids:[goodsEntity.getId()]}
expenseItem.setGoodsScope("{\"strategy\":\"ZhiDing\",\"ids\":[" + goodsEntity.getId() + "]}");
expenseItemService.save(expenseItem);
}