feat(wms): 添加发货单到货确认功能

- 在WmsShippingBill实体类中新增到货确认相关字段:needArrivalConfirm、isAllReceiving、arrivalReceiptOssId、arrivalConfirmTime、arrivalConfirmBy
- 在WmsShippingBillBo业务对象中同步添加到货确认相关属性
- 在WmsShippingBillVo视图对象中添加到货确认相关字段并配置Excel导出注解
- 修改数据库映射文件WmsShippingBillMapper.xml,更新查询语句以包含新字段并关联用户表查询确认人姓名
- 在WmsShippingBillServiceImpl服务实现中添加到货确认逻辑处理
- 实现根据发货类型自动判定是否需要到货确认的功能
- 添加发货单号自动生成机制,集成远程编码规则服务
- 完善查询包装器,支持按到货确认时间和发货时间范围筛选
- 优化流程变量设置,确保到货确认节点抄送人员验证
- 修复getVariables方法中的潜在空指针问题
dev
zangch@mesnac.com 5 days ago
parent 3c25f0e0cc
commit 091d3eb2ff

@ -205,6 +205,31 @@ public class WmsShippingBill extends TenantEntity {
*/
private String flowStatus;
/**
* 1 01=12=/3=0
*/
private String needArrivalConfirm;
/**
* 0 1
*/
private String isAllReceiving;
/**
* OSS ID
*/
private String arrivalReceiptOssId;
/**
*
*/
private Date arrivalConfirmTime;
/**
* user_id
*/
private Long arrivalConfirmBy;
/**
* shipping_status1 2 3 4
*/

@ -205,6 +205,31 @@ public class WmsShippingBillBo extends BaseEntity {
*/
private String flowStatus;
/**
* 1 0
*/
private String needArrivalConfirm;
/**
* 0 1
*/
private String isAllReceiving;
/**
* OSS ID
*/
private String arrivalReceiptOssId;
/**
*
*/
private Date arrivalConfirmTime;
/**
*
*/
private Long arrivalConfirmBy;
/**
* shipping_status1 2 3 4
*/
@ -247,7 +272,7 @@ public class WmsShippingBillBo extends BaseEntity {
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
variables = new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;

@ -257,6 +257,52 @@ public class WmsShippingBillVo implements Serializable {
@ExcelProperty(value = "流程状态")
private String flowStatus;
/**
* 1 0
*/
@ExcelProperty(value = "是否需到货确认")
private String needArrivalConfirm;
/**
* 0 1
*/
@ExcelProperty(value = "到货标识")
private String isAllReceiving;
/**
* OSS ID
*/
@ExcelProperty(value = "到货收货单附件")
private String arrivalReceiptOssId;
/**
*
*/
@ExcelProperty(value = "到货确认时间")
private Date arrivalConfirmTime;
/**
* user_id
*/
private Long arrivalConfirmBy;
/**
*
*/
@ExcelProperty(value = "到货确认人")
private String arrivalConfirmByName;
/**
*
*/
private Long createBy;
/**
*
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* shipping_status1 2 3 4
*/

@ -81,4 +81,5 @@ public interface IWmsShippingBillService {
* @return WordMap
*/
java.util.Map<String, Object> buildWordExportData(Long shippingBillId);
}

@ -20,7 +20,9 @@ import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.wms.domain.WmsShippingBill;
import org.dromara.wms.domain.WmsShippingDetails;
import org.dromara.wms.domain.bo.WmsShippingBillBo;
@ -51,11 +53,16 @@ import java.util.stream.Collectors;
@Slf4j
public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
private static final String SHIPPING_FLOW_CODE = "WMSSP";
private static final String SHIPPING_BILL_CODE_RULE = "1014";
private final WmsShippingBillMapper baseMapper;
private final WmsShippingDetailsMapper detailsMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
@ -108,6 +115,9 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
private MPJLambdaWrapper<WmsShippingBill> buildQueryWrapper(WmsShippingBillBo bo) {
Map<String, Object> params = bo.getParams();
if (params == null) {
params = new HashMap<>(4);
}
MPJLambdaWrapper<WmsShippingBill> lqw = JoinWrappers.lambda(WmsShippingBill.class)
.selectAll(WmsShippingBill.class)
.eq(WmsShippingBill::getDelFlag, "0")
@ -145,9 +155,15 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
.eq(StringUtils.isNotBlank(bo.getOutStockBillStatus()), WmsShippingBill::getOutStockBillStatus, bo.getOutStockBillStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), WmsShippingBill::getFlowStatus, bo.getFlowStatus())
.eq(StringUtils.isNotBlank(bo.getShippingStatus()), WmsShippingBill::getShippingStatus, bo.getShippingStatus())
.eq(StringUtils.isNotBlank(bo.getNeedArrivalConfirm()), WmsShippingBill::getNeedArrivalConfirm, bo.getNeedArrivalConfirm())
.eq(StringUtils.isNotBlank(bo.getIsAllReceiving()), WmsShippingBill::getIsAllReceiving, bo.getIsAllReceiving())
.eq(bo.getWarehouseId() != null, WmsShippingBill::getWarehouseId, bo.getWarehouseId())
.like(StringUtils.isNotBlank(bo.getWarehouseName()), WmsShippingBill::getWarehouseName, bo.getWarehouseName())
;
.ge(params.get("beginShippingTime") != null, WmsShippingBill::getShippingTime, params.get("beginShippingTime"))
.le(params.get("endShippingTime") != null, WmsShippingBill::getShippingTime, params.get("endShippingTime"))
.ge(params.get("beginArrivalConfirmTime") != null, WmsShippingBill::getArrivalConfirmTime, params.get("beginArrivalConfirmTime"))
.le(params.get("endArrivalConfirmTime") != null, WmsShippingBill::getArrivalConfirmTime, params.get("endArrivalConfirmTime"))
.orderByDesc(WmsShippingBill::getCreateTime);
return lqw;
}
@ -161,10 +177,12 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(WmsShippingBillBo bo) {
WmsShippingBill add = MapstructUtils.convert(bo, WmsShippingBill.class);
fillShippingCode(add);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setShippingBillId(add.getShippingBillId());
bo.setShippingCode(add.getShippingCode());
// 同步保存明细列表
List<WmsShippingDetails> detailsList = bo.getDetailsList();
if (CollUtil.isNotEmpty(detailsList)) {
@ -272,6 +290,7 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
/**
*
* shippingType shippingType
*
* @param bo
* @return VO
@ -279,6 +298,11 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
@Override
@Transactional(rollbackFor = Exception.class)
public WmsShippingBillVo shippingBillSubmitAndFlowStart(WmsShippingBillBo bo) {
// 根据发货类型决定是否需要到货确认1=普通发货需确认2=备件/3=物流不需确认
String shippingType = bo.getShippingType();
boolean needConfirm = !"2".equals(shippingType) && !"3".equals(shippingType);
bo.setNeedArrivalConfirm(needConfirm ? "1" : "0");
WmsShippingBill add = MapstructUtils.convert(bo, WmsShippingBill.class);
validEntityBeforeSave(add);
if (StringUtils.isNull(bo.getShippingBillId())) {
@ -286,19 +310,50 @@ public class WmsShippingBillServiceImpl implements IWmsShippingBillService {
} else {
this.updateByBo(bo);
}
// Why统一使用同一个变量Map避免 variables 为空时多次 getVariables() 产生临时Map导致变量丢失
Map<String, Object> variables = bo.getVariables();
// 流程变量shippingType 用于互斥网关分支条件applicantId 兼容已有流程变量使用
variables.put("shippingType", StringUtils.defaultIfBlank(shippingType, "1"));
variables.put("shippingCode", bo.getShippingCode());
variables.put("applicantId", String.valueOf(LoginHelper.getUserId()));
// Why到货确认节点配置了 ${tManagerId} 抄送表达式,发起流程时必须保证变量有效
if (needConfirm) {
String tManagerId = StringUtils.trim(Convert.toStr(variables.get("tManagerId")));
if (StringUtils.isBlank(tManagerId) || "null".equalsIgnoreCase(tManagerId)) {
throw new ServiceException("到货确认节点抄送人员不能为空");
}
variables.put("tManagerId", tManagerId);
}
// 后端发起需要忽略权限
bo.getVariables().put("ignore", true);
variables.put("ignore", true);
if (StringUtils.isBlank(bo.getBizExt().getBusinessCode())) {
bo.getBizExt().setBusinessCode(bo.getShippingCode());
}
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(bo.getShippingBillId().toString());
startProcess.setFlowCode(bo.getFlowCode());
startProcess.setVariables(bo.getVariables());
startProcess.setFlowCode(SHIPPING_FLOW_CODE);
startProcess.setVariables(variables);
startProcess.setBizExt(bo.getBizExt());
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess);
if (!flagOne) {
throw new ServiceException("流程发起异常");
}
return MapstructUtils.convert(add, WmsShippingBillVo.class);
return queryById(bo.getShippingBillId());
}
/**
*
*/
private void fillShippingCode(WmsShippingBill entity) {
if (StringUtils.isNotBlank(entity.getShippingCode())) {
return;
}
String code = remoteCodeRuleService.selectCodeRuleCode(SHIPPING_BILL_CODE_RULE);
if (StringUtils.isBlank(code)) {
throw new ServiceException("生成发货单号失败");
}
entity.setShippingCode(code);
}
/**

@ -7,15 +7,23 @@
</resultMap>
<select id="selectCustomWmsShippingBillVoList" resultMap="WmsShippingBillResult">
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code,
t.project_name, t.customer_id, t.customer_contact_id, t.customer_name,
t.shipping_address, t.inventory_amount, t.source_bill_type, t.source_bill_id,
t.source_bill_code, t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user, t.contact_number, t.receiver_name, t.receiver_phone, t.logistics_company, t.tracking_no, t.logistics_phone, t.directions, t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time, t.out_stock_bill_status, t.flow_status, t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code,
t.project_name, t.customer_id, t.customer_contact_id, t.customer_name,
t.shipping_address, t.inventory_amount, t.source_bill_type, t.source_bill_id,
t.source_bill_code, t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user, t.contact_number, t.receiver_name, t.receiver_phone,
t.logistics_company, t.tracking_no, t.logistics_phone, t.directions,
t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time,
t.out_stock_bill_status, t.flow_status,
t.need_arrival_confirm, t.is_all_receiving, t.arrival_receipt_oss_id, t.arrival_confirm_time, t.arrival_confirm_by,
u.nick_name as arrivalConfirmByName,
t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark,
t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from wms_shipping_bill t
left join erp_contract_info c on t.contract_id = c.contract_id
left join sys_user u on t.arrival_confirm_by = u.user_id
<where>
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
AND ${ew.sqlSegment}
@ -23,35 +31,47 @@
</where>
</select>
<!-- 根据ID查询详情联查合同获取SAP订单号 -->
<!-- 根据ID查询详情联查合同获取SAP订单号联查sys_user获取到货确认人姓名 -->
<select id="selectCustomWmsShippingBillVoById" resultMap="WmsShippingBillResult">
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code, t.project_name,
t.customer_id, t.customer_contact_id, t.customer_name, t.shipping_address,
t.inventory_amount, t.source_bill_type, t.source_bill_id, t.source_bill_code,
t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user,
t.contact_number, t.receiver_name, t.receiver_phone, t.logistics_company, t.tracking_no, t.logistics_phone, t.directions, t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time, t.out_stock_bill_status, t.flow_status, t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code, t.project_name,
t.customer_id, t.customer_contact_id, t.customer_name, t.shipping_address,
t.inventory_amount, t.source_bill_type, t.source_bill_id, t.source_bill_code,
t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user, t.contact_number,
t.receiver_name, t.receiver_phone, t.logistics_company, t.tracking_no, t.logistics_phone,
t.directions, t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time,
t.out_stock_bill_status, t.flow_status,
t.need_arrival_confirm, t.is_all_receiving, t.arrival_receipt_oss_id, t.arrival_confirm_time, t.arrival_confirm_by,
u.nick_name as arrivalConfirmByName,
t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark,
t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from wms_shipping_bill t
left join erp_contract_info c on t.contract_id = c.contract_id
left join sys_user u on t.arrival_confirm_by = u.user_id
where t.shipping_bill_id = #{shippingBillId}
</select>
<!-- 批量查询 - 根据ID列表联查合同获取SAP订单号 -->
<select id="selectCustomWmsShippingBillVoByIds" resultMap="WmsShippingBillResult">
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code, t.project_name,
t.customer_id, t.customer_contact_id, t.customer_name, t.shipping_address,
t.inventory_amount, t.source_bill_type, t.source_bill_id, t.source_bill_code,
t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user, t.contact_number, t.receiver_name,
t.receiver_phone, t.logistics_company, t.tracking_no, t.logistics_phone, t.directions,
t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time,
t.out_stock_bill_status, t.flow_status, t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code, t.project_name,
t.customer_id, t.customer_contact_id, t.customer_name, t.shipping_address,
t.inventory_amount, t.source_bill_type, t.source_bill_id, t.source_bill_code,
t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user, t.contact_number, t.receiver_name,
t.receiver_phone, t.logistics_company, t.tracking_no, t.logistics_phone, t.directions,
t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time,
t.out_stock_bill_status, t.flow_status,
t.need_arrival_confirm, t.is_all_receiving, t.arrival_receipt_oss_id, t.arrival_confirm_time, t.arrival_confirm_by,
u.nick_name as arrivalConfirmByName,
t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark,
t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from wms_shipping_bill t
left join erp_contract_info c on t.contract_id = c.contract_id
left join sys_user u on t.arrival_confirm_by = u.user_id
where t.shipping_bill_id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
@ -70,9 +90,23 @@
<!-- 分页查询带自定义条件联查合同获取SAP订单号 -->
<select id="selectCustomWmsShippingBillVoPage" resultMap="WmsShippingBillResult">
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type, t.shipping_mode, t.bind_type, t.project_id, t.project_code, t.project_name, t.customer_id, t.customer_contact_id, t.customer_name, t.shipping_address, t.inventory_amount, t.source_bill_type, t.source_bill_id, t.source_bill_code, t.contract_id, t.contract_code, t.contract_name, c.order_contract_code as orderContractCode, t.supplier, t.supplier_id, t.contact_user, t.contact_number, t.receiver_name, t.receiver_phone, t.logistics_company, t.tracking_no, t.logistics_phone, t.directions, t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time, t.out_stock_bill_status, t.flow_status, t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
select t.shipping_bill_id, t.tenant_id, t.shipping_code, t.shipping_type,
t.shipping_mode, t.bind_type, t.project_id, t.project_code, t.project_name,
t.customer_id, t.customer_contact_id, t.customer_name, t.shipping_address,
t.inventory_amount, t.source_bill_type, t.source_bill_id, t.source_bill_code,
t.contract_id, t.contract_code, t.contract_name,
c.order_contract_code as orderContractCode,
t.supplier, t.supplier_id, t.contact_user, t.contact_number, t.receiver_name, t.receiver_phone,
t.logistics_company, t.tracking_no, t.logistics_phone, t.directions,
t.plan_arrival_time, t.shipping_time, t.received_time, t.completed_time,
t.out_stock_bill_status, t.flow_status,
t.need_arrival_confirm, t.is_all_receiving, t.arrival_receipt_oss_id, t.arrival_confirm_time, t.arrival_confirm_by,
u.nick_name as arrivalConfirmByName,
t.shipping_status, t.warehouse_id, t.warehouse_name, t.remark,
t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from wms_shipping_bill t
left join erp_contract_info c on t.contract_id = c.contract_id
left join sys_user u on t.arrival_confirm_by = u.user_id
<where>
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
AND ${ew.sqlSegment}

Loading…
Cancel
Save