Commit 3e9b76d4 authored by Smile's avatar Smile

需求129 后台-集运-包裹列表-编辑包裹

parent 17fc408c
...@@ -106,3 +106,6 @@ create table ecw_cons_tracking_record ...@@ -106,3 +106,6 @@ create table ecw_cons_tracking_record
); );
alter table ecw_cons_tracking_record comment '包裹动态跟踪表'; alter table ecw_cons_tracking_record comment '包裹动态跟踪表';
ALTER TABLE jiedao.ecw_cons_item MODIFY COLUMN id bigint auto_increment NOT NULL;
package cn.iocoder.yudao.module.order.service.cons; package cn.iocoder.yudao.module.order.service.cons;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource; import javax.annotation.Resource;
import cn.iocoder.yudao.framework.common.util.code.CodeUtils;
import cn.iocoder.yudao.framework.i18n.core.I18nMessage; import cn.iocoder.yudao.framework.i18n.core.I18nMessage;
import cn.iocoder.yudao.framework.i18n.core.LangEnum; import cn.iocoder.yudao.framework.i18n.core.LangEnum;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.order.convert.cons.ConsConvert; import cn.iocoder.yudao.module.order.convert.cons.ConsConvert;
import cn.iocoder.yudao.module.order.convert.consItem.ConsItemConvert;
import cn.iocoder.yudao.module.order.dal.dataobject.cons.ConsDO; import cn.iocoder.yudao.module.order.dal.dataobject.cons.ConsDO;
import cn.iocoder.yudao.module.order.dal.mysql.cons.ConsMapper; import cn.iocoder.yudao.module.order.dal.mysql.cons.ConsMapper;
import cn.iocoder.yudao.module.order.service.consItem.ConsItemService; import cn.iocoder.yudao.module.order.service.consItem.ConsItemService;
...@@ -17,7 +22,11 @@ import cn.iocoder.yudao.module.order.vo.cons.ConsUpdateReqVO; ...@@ -17,7 +22,11 @@ import cn.iocoder.yudao.module.order.vo.cons.ConsUpdateReqVO;
import cn.iocoder.yudao.module.order.vo.consItem.ConsItemBackVO; import cn.iocoder.yudao.module.order.vo.consItem.ConsItemBackVO;
import cn.iocoder.yudao.module.order.vo.consItem.ConsItemQueryVO; import cn.iocoder.yudao.module.order.vo.consItem.ConsItemQueryVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO; import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.framework.mybatis.core.service.AbstractService; import cn.iocoder.yudao.framework.mybatis.core.service.AbstractService;
...@@ -39,12 +48,32 @@ public class ConsServiceImpl extends AbstractService<ConsMapper, ConsDO> impleme ...@@ -39,12 +48,32 @@ public class ConsServiceImpl extends AbstractService<ConsMapper, ConsDO> impleme
@Resource @Resource
private ConsItemService consItemService; private ConsItemService consItemService;
@Resource
private RedissonClient redissonClient;
@Override @Override
@Transactional
public Long createCons(ConsCreateReqVO createReqVO) { public Long createCons(ConsCreateReqVO createReqVO) {
// 插入 validateCons(createReqVO);
if (consMapper.selectOne("express_no", createReqVO.getExpressNo()) != null) {
throw exception(30004,"包裹快递号已存在");
}
String warehouseCode = "";
if (createReqVO.getWareId().equals(1L)){
warehouseCode = "F";
}else if (createReqVO.getWareId().equals(3L)){
warehouseCode = "Y";
}else {
warehouseCode = "F";
}
String consNum = generateConsNumber(warehouseCode);
ConsDO cons = ConsConvert.INSTANCE.convert(createReqVO); ConsDO cons = ConsConvert.INSTANCE.convert(createReqVO);
cons.setConsNum(consNum);
consMapper.insert(cons); consMapper.insert(cons);
// 返回 createReqVO.getConsItemVOList().forEach(consItemVO -> {
consItemVO.setConsId(cons.getId());
consItemService.createConsItem(consItemVO);
});
return cons.getId(); return cons.getId();
} }
...@@ -64,7 +93,23 @@ public class ConsServiceImpl extends AbstractService<ConsMapper, ConsDO> impleme ...@@ -64,7 +93,23 @@ public class ConsServiceImpl extends AbstractService<ConsMapper, ConsDO> impleme
// 删除 // 删除
consMapper.deleteById(id); consMapper.deleteById(id);
} }
private void validateCons(ConsCreateReqVO createReqVO){
if (createReqVO.getWareId()==null){
throw exception(30004,"请选择仓库");
}
if (createReqVO.getExpressNo()==null){
throw exception(30004,"包裹快递号不能为空");
}
if (createReqVO.getExpressId()==null){
throw exception(30004,"请选择快递公司");
}
if (createReqVO.getTransportId()==null&&createReqVO.getConsigneeCityId()==null){
throw exception(30004,"请选择运输方式或目的城市");
}
if (createReqVO.getConsItemVOList().isEmpty()){
throw exception(30004,"包裹项不能为空");
}
}
private void validateConsExists(Long id) { private void validateConsExists(Long id) {
if (consMapper.selectById(id) == null) { if (consMapper.selectById(id) == null) {
throw exception(30004,"包裹不存在"); throw exception(30004,"包裹不存在");
...@@ -105,4 +150,35 @@ public class ConsServiceImpl extends AbstractService<ConsMapper, ConsDO> impleme ...@@ -105,4 +150,35 @@ public class ConsServiceImpl extends AbstractService<ConsMapper, ConsDO> impleme
public List<ConsDO> getConsList(ConsQueryVO query) { public List<ConsDO> getConsList(ConsQueryVO query) {
return consMapper.selectList(query); return consMapper.selectList(query);
} }
//生成包裹号
public String generateConsNumber(String warehouseCode){
// 1. 获取当前年份(如25)
String currentYear = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy"));
String key = "cons_seq:" + warehouseCode + ":" + currentYear;
// 2. 获取原子计数器
RAtomicLong counter = redissonClient.getAtomicLong(key);
// 3. 处理年份切换:如果计数器不存在或为0,则初始化
if (counter.get() == 0) {
RLock lock = redissonClient.getLock(key + ":lock");
try {
lock.lock(); // 加锁防止并发初始化
// 双重检查
if (counter.get() == 0) {
// 初始序号从1开始
counter.set(1L);
// 设置1年过期
counter.expire(365, TimeUnit.DAYS);
}
} finally {
lock.unlock();
}
}
// 4. 自增序号并生成包裹号
long sequence = counter.incrementAndGet();
return String.format("%s%s%06d", warehouseCode, currentYear, sequence);
}
} }
...@@ -199,7 +199,7 @@ public class ConsBackVO { ...@@ -199,7 +199,7 @@ public class ConsBackVO {
@ExcelProperty("销售渠道") @ExcelProperty("销售渠道")
@ApiModelProperty(value = "销售渠道") @ApiModelProperty(value = "销售渠道")
private String channelName; private String channelId;
@ExcelProperty("动态") @ExcelProperty("动态")
@ApiModelProperty(value = "动态") @ApiModelProperty(value = "动态")
......
package cn.iocoder.yudao.module.order.vo.cons; package cn.iocoder.yudao.module.order.vo.cons;
import cn.iocoder.yudao.module.order.vo.consItem.ConsItemCreateReqVO;
import lombok.*; import lombok.*;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import java.util.List;
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ApiModel("管理后台 - 集运包裹主创建 Request VO") @ApiModel("管理后台 - 集运包裹主创建 Request VO")
public class ConsCreateReqVO extends ConsBaseVO { public class ConsCreateReqVO extends ConsBaseVO {
@ApiModelProperty(value = "包裹项")
private List<ConsItemCreateReqVO> consItemVOList;
} }
...@@ -13,7 +13,6 @@ import java.math.BigDecimal; ...@@ -13,7 +13,6 @@ import java.math.BigDecimal;
public class ConsItemBaseVO { public class ConsItemBaseVO {
@ApiModelProperty(value = "", required = true) @ApiModelProperty(value = "", required = true)
@NotNull(message = "不能为空")
private Long consId; private Long consId;
@ApiModelProperty(value = "商品ID") @ApiModelProperty(value = "商品ID")
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
select count(1) select count(1)
FROM ecw_cons cons FROM ecw_cons cons
left join ecw_customer ec on cons.customer_id = ec.id left join ecw_customer ec on cons.customer_id = ec.id
left join ecw_customer_contacts eccs on ec.id = eccs.customer_id
left join ecw_warehouse_line el on cons.warehouse_line_id = el.id left join ecw_warehouse_line el on cons.warehouse_line_id = el.id
LEFT JOIN ecw_warehouse ew_start ON ew_start.id = el.start_warehouse_id LEFT JOIN ecw_warehouse ew_start ON ew_start.id = el.start_warehouse_id
LEFT JOIN ecw_warehouse ew_dest ON ew_dest.id = el.dest_warehouse_id LEFT JOIN ecw_warehouse ew_dest ON ew_dest.id = el.dest_warehouse_id
...@@ -29,26 +28,16 @@ ...@@ -29,26 +28,16 @@
ctr.tracking_time, ctr.tracking_time,
o.order_no, o.order_no,
o.status as orderStatus, o.status as orderStatus,
GROUP_CONCAT( o.channel_id
CASE #{query.lang}
WHEN 0 then ecc.name_zh
WHEN 1 then ecc.name_en
WHEN 2 then ecc.name_fr
else ecc.name_zh
END SEPARATOR ', '
) AS channelName
FROM ecw_cons cons FROM ecw_cons cons
left join ecw_customer ec on cons.customer_id = ec.id left join ecw_customer ec on cons.customer_id = ec.id
left join ecw_customer_contacts eccs on ec.id = eccs.customer_id left join ecw_customer_contacts eccs on ec.id = eccs.customer_id
left join ecw_warehouse_line el on cons.warehouse_line_id = el.id left join ecw_warehouse_line el on cons.warehouse_line_id = el.id
left join ecw_warehouse ew_start ON ew_start.id = el.start_warehouse_id left join ecw_warehouse ew_start ON ew_start.id = el.start_warehouse_id
left join ecw_warehouse ew_dest ON ew_dest.id = el.dest_warehouse_id left join ecw_warehouse ew_dest ON ew_dest.id = el.dest_warehouse_id
left join ecw_line_channel_packaging elcp on cons.warehouse_line_id = elcp.line_id
LEFT JOIN ecw_channel ecc ON FIND_IN_SET(ecc.channel_id, elcp.channel_ids)
left join ecw_cons_tracking_record ctr on cons.id = ctr.cons_id left join ecw_cons_tracking_record ctr on cons.id = ctr.cons_id
left join ecw_order o on cons.order_id = o.order_id left join ecw_order o on cons.order_id = o.order_id
WHERE cons.deleted = 0 WHERE cons.deleted = 0
and elcp.deleted = 0
<include refid="myConsQuery"/> <include refid="myConsQuery"/>
order by cons.update_time desc order by cons.update_time desc
limit #{start}, #{size} limit #{start}, #{size}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment