feat(oa): 新增根据项目ID查询送货单和工艺卡明细功能

- 在IOaDeliveryOrderDetailService和IOaProcessCardDetailService接口中新增queryListByProjectId方法
- 在对应的controller中增加listDetailsByProjectId接口,支持通过项目ID查询明细列表
- 实现service层逻辑,通过项目ID获取相关订单或卡片ID,再查询对应明细数据
- 扩展mapper接口和xml文件,新增selectVoListByOrderIds和selectVoListByCardIds方法用于批量查询
- 更新分页查询逻辑,优化查询条件构造器,加入项目关联信息查询支持
- 添加必要的导入语句及字段校验注解,确保参数合法性
- 补充项目相关信息字段到OaDeliveryOrderVo和OaProcessCardVo视图对象中
This commit is contained in:
2025-12-08 17:28:16 +08:00
parent 7051de1fab
commit 18cc98bc65
18 changed files with 252 additions and 4 deletions

View File

@@ -98,4 +98,17 @@ public class OaDeliveryOrderDetailController extends BaseController {
@PathVariable Long[] detailIds) {
return toAjax(iOaDeliveryOrderDetailService.deleteWithValidByIds(Arrays.asList(detailIds), true));
}
/**
* 根据项目ID查询送货单明细列表
*
* @param projectId 项目ID
* @return 送货单明细列表
*/
@GetMapping("/detail/listByProject/{projectId}")
public R<List<OaDeliveryOrderDetailVo>> listDetailsByProjectId(@NotNull(message = "项目ID不能为空")
@PathVariable Long projectId) {
List<OaDeliveryOrderDetailVo> list = iOaDeliveryOrderDetailService.queryListByProjectId(projectId);
return R.ok(list);
}
}

View File

@@ -98,4 +98,18 @@ public class OaProcessCardDetailController extends BaseController {
@PathVariable Long[] detailIds) {
return toAjax(iOaProcessCardDetailService.deleteWithValidByIds(Arrays.asList(detailIds), true));
}
/**
* 根据项目ID查询工艺卡明细列表
*
* @param projectId 项目ID
* @return 工艺卡明细列表
*/
@GetMapping("/detail/listByProject/{projectId}")
public R<List<OaProcessCardDetailVo>> listDetailsByProjectId(@NotNull(message = "项目ID不能为空")
@PathVariable Long projectId) {
List<OaProcessCardDetailVo> list = iOaProcessCardDetailService.queryListByProjectId(projectId);
return R.ok(list);
}
}

View File

@@ -130,5 +130,10 @@ public class OaDeliveryOrderVo {
@ExcelProperty(value = "备注")
private String remark;
//联查项目信息
private String projectName;
private String projectCode;
private String projectNum;
}

View File

@@ -73,5 +73,9 @@ public class OaProcessCardVo {
@ExcelProperty(value = "备注")
private String remark;
//联查项目信息
private String projectName;
private String projectCode;
private String projectNum;
}

View File

@@ -4,6 +4,8 @@ import com.ruoyi.oa.domain.OaDeliveryOrderDetail;
import com.ruoyi.oa.domain.vo.OaDeliveryOrderDetailVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 送货单明细Mapper接口
*
@@ -12,4 +14,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/
public interface OaDeliveryOrderDetailMapper extends BaseMapperPlus<OaDeliveryOrderDetailMapper, OaDeliveryOrderDetail, OaDeliveryOrderDetailVo> {
List<OaDeliveryOrderDetailVo> selectVoListByOrderIds(List<Long> orderIds);
}

View File

@@ -1,8 +1,13 @@
package com.ruoyi.oa.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.oa.domain.OaDeliveryOrder;
import com.ruoyi.oa.domain.vo.OaDeliveryOrderVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
/**
* 送货单主Mapper接口
@@ -12,4 +17,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/
public interface OaDeliveryOrderMapper extends BaseMapperPlus<OaDeliveryOrderMapper, OaDeliveryOrder, OaDeliveryOrderVo> {
Page<OaDeliveryOrderVo> selectVoPagePlus(Page<Object> build,@Param(Constants.WRAPPER) QueryWrapper<OaDeliveryOrder> lqw);
}

View File

@@ -4,6 +4,8 @@ import com.ruoyi.oa.domain.OaProcessCardDetail;
import com.ruoyi.oa.domain.vo.OaProcessCardDetailVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 工艺卡明细Mapper接口
*
@@ -12,4 +14,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/
public interface OaProcessCardDetailMapper extends BaseMapperPlus<OaProcessCardDetailMapper, OaProcessCardDetail, OaProcessCardDetailVo> {
List<OaProcessCardDetailVo> selectVoListByCardIds(List<Long> cardIds);
}

View File

@@ -1,8 +1,12 @@
package com.ruoyi.oa.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.oa.domain.OaProcessCard;
import com.ruoyi.oa.domain.vo.OaProcessCardVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
/**
* 工艺卡主Mapper接口
@@ -12,4 +16,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/
public interface OaProcessCardMapper extends BaseMapperPlus<OaProcessCardMapper, OaProcessCard, OaProcessCardVo> {
Page<OaProcessCardVo> selectVoPagePlus(Page<Object> build, @Param(Constants.WRAPPER) QueryWrapper<OaProcessCard> lqw);
}

View File

@@ -6,6 +6,7 @@ import com.ruoyi.oa.domain.bo.OaDeliveryOrderDetailBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
@@ -46,4 +47,6 @@ public interface IOaDeliveryOrderDetailService {
* 校验并批量删除送货单明细信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
List<OaDeliveryOrderDetailVo> queryListByProjectId(@NotNull(message = "项目ID不能为空") Long projectId);
}

View File

@@ -6,6 +6,7 @@ import com.ruoyi.oa.domain.bo.OaProcessCardDetailBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
@@ -46,4 +47,9 @@ public interface IOaProcessCardDetailService {
* 校验并批量删除工艺卡明细信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据项目ID查询工艺卡明细列表
*/
List<OaProcessCardDetailVo> queryListByProjectId(@NotNull(message = "项目ID不能为空") Long projectId);
}

View File

@@ -1,12 +1,17 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.oa.domain.OaDeliveryOrder;
import com.ruoyi.oa.domain.vo.OaDeliveryOrderVo;
import com.ruoyi.oa.mapper.OaDeliveryOrderMapper;
import com.ruoyi.oa.service.IOaDeliveryOrderService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.OaDeliveryOrderDetailBo;
@@ -15,9 +20,11 @@ import com.ruoyi.oa.domain.OaDeliveryOrderDetail;
import com.ruoyi.oa.mapper.OaDeliveryOrderDetailMapper;
import com.ruoyi.oa.service.IOaDeliveryOrderDetailService;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 送货单明细Service业务层处理
@@ -30,6 +37,7 @@ import java.util.Collection;
public class OaDeliveryOrderDetailServiceImpl implements IOaDeliveryOrderDetailService {
private final OaDeliveryOrderDetailMapper baseMapper;
private final OaDeliveryOrderMapper oaDeliveryOrderMapper;
/**
* 查询送货单明细
@@ -120,4 +128,15 @@ public class OaDeliveryOrderDetailServiceImpl implements IOaDeliveryOrderDetailS
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public List<OaDeliveryOrderDetailVo> queryListByProjectId(Long projectId) {
//拿到projectId下的所有orderId
LambdaQueryWrapper<OaDeliveryOrder> wrapper = Wrappers.lambdaQuery();
wrapper.eq(OaDeliveryOrder::getProjectId, projectId);
List<OaDeliveryOrder> orderList = oaDeliveryOrderMapper.selectList(wrapper);
//然后根据orderId拿到所有的detail
List<Long> orderIdList = orderList.stream().map(OaDeliveryOrder::getOrderId).collect(Collectors.toList());
return baseMapper.selectVoListByOrderIds(orderIdList);
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
@@ -44,11 +45,40 @@ public class OaDeliveryOrderServiceImpl implements IOaDeliveryOrderService {
*/
@Override
public TableDataInfo<OaDeliveryOrderVo> queryPageList(OaDeliveryOrderBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<OaDeliveryOrder> lqw = buildQueryWrapper(bo);
Page<OaDeliveryOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
QueryWrapper<OaDeliveryOrder> qw = buildQueryWrapperPlus(bo);
Page<OaDeliveryOrderVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), qw);
return TableDataInfo.build(result);
}
private QueryWrapper<OaDeliveryOrder> buildQueryWrapperPlus(OaDeliveryOrderBo bo) {
QueryWrapper<OaDeliveryOrder> qw = new QueryWrapper<>();
// 等值查询条件带表别名odo
qw.eq(StringUtils.isNotBlank(bo.getDeliveryOrderNo()), "odo.delivery_order_no", bo.getDeliveryOrderNo());
qw.eq(bo.getProjectId() != null, "odo.project_id", bo.getProjectId());
qw.eq(StringUtils.isNotBlank(bo.getContractNo()), "odo.contract_no", bo.getContractNo());
qw.eq(StringUtils.isNotBlank(bo.getUserContractNo()), "odo.user_contract_no", bo.getUserContractNo());
qw.eq(StringUtils.isNotBlank(bo.getProcurementNo()), "odo.procurement_no", bo.getProcurementNo());
qw.eq(StringUtils.isNotBlank(bo.getDeliveryDestination()), "odo.delivery_destination", bo.getDeliveryDestination());
qw.eq(StringUtils.isNotBlank(bo.getDeliveryAddress()), "odo.delivery_address", bo.getDeliveryAddress());
qw.eq(StringUtils.isNotBlank(bo.getReceiver()), "odo.receiver", bo.getReceiver());
qw.eq(StringUtils.isNotBlank(bo.getReceiverPhone()), "odo.receiver_phone", bo.getReceiverPhone());
qw.eq(StringUtils.isNotBlank(bo.getSupplierContact()), "odo.supplier_contact", bo.getSupplierContact());
qw.eq(StringUtils.isNotBlank(bo.getSupplierPhone()), "odo.supplier_phone", bo.getSupplierPhone());
qw.eq(StringUtils.isNotBlank(bo.getReceivingCompany()), "odo.receiving_company", bo.getReceivingCompany());
qw.eq(StringUtils.isNotBlank(bo.getActualReceiver()), "odo.actual_receiver", bo.getActualReceiver());
qw.eq(StringUtils.isNotBlank(bo.getConstructionCompany()), "odo.construction_company", bo.getConstructionCompany());
qw.eq(StringUtils.isNotBlank(bo.getDeliveryRemark()), "odo.delivery_remark", bo.getDeliveryRemark());
// 模糊查询(供应商全称)
qw.like(StringUtils.isNotBlank(bo.getSupplierFullname()), "odo.supplier_fullname", bo.getSupplierFullname());
// 按创建时间降序排序
qw.orderByDesc("odo.create_time");
//逻辑删除
qw.eq("odo.del_flag", 0);
return qw;
}
/**
* 查询送货单主列表
*/

View File

@@ -7,6 +7,8 @@ import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.oa.domain.OaProcessCard;
import com.ruoyi.oa.mapper.OaProcessCardMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.OaProcessCardDetailBo;
@@ -18,6 +20,7 @@ import com.ruoyi.oa.service.IOaProcessCardDetailService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 工艺卡明细Service业务层处理
@@ -31,6 +34,8 @@ public class OaProcessCardDetailServiceImpl implements IOaProcessCardDetailServi
private final OaProcessCardDetailMapper baseMapper;
private final OaProcessCardMapper oaProcessCardMapper;
/**
* 查询工艺卡明细
*/
@@ -115,4 +120,18 @@ public class OaProcessCardDetailServiceImpl implements IOaProcessCardDetailServi
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 根据项目ID查询工艺卡明细列表
*/
@Override
public List<OaProcessCardDetailVo> queryListByProjectId(Long projectId) {
//拿到projectId下的所有cardId
LambdaQueryWrapper<OaProcessCard> wrapper = Wrappers.lambdaQuery();
wrapper.eq(OaProcessCard::getProjectId, projectId);
List<OaProcessCard> cardList = oaProcessCardMapper.selectList(wrapper);
//然后根据cardId拿到所有的detail
List<Long> cardIdList = cardList.stream().map(OaProcessCard::getCardId).collect(Collectors.toList());
return baseMapper.selectVoListByCardIds(cardIdList);
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
@@ -44,11 +45,30 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService {
*/
@Override
public TableDataInfo<OaProcessCardVo> queryPageList(OaProcessCardBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<OaProcessCard> lqw = buildQueryWrapper(bo);
Page<OaProcessCardVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
QueryWrapper<OaProcessCard> lqw = buildQueryWrapperPlus(bo);
Page<OaProcessCardVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
private QueryWrapper<OaProcessCard> buildQueryWrapperPlus(OaProcessCardBo bo) {
QueryWrapper<OaProcessCard> qw = Wrappers.query();
// 等值查询带表别名oc使用数据库下划线字段名
qw.eq(bo.getProjectId() != null, "oc.project_id", bo.getProjectId());
qw.eq(bo.getEquipmentQuantity() != null, "oc.equipment_quantity", bo.getEquipmentQuantity());
qw.eq(StringUtils.isNotBlank(bo.getManufacturingLeader()), "oc.manufacturing_leader", bo.getManufacturingLeader());
qw.eq(StringUtils.isNotBlank(bo.getOperationLeader()), "oc.operation_leader", bo.getOperationLeader());
qw.eq(bo.getPlannedDeliveryDate() != null, "oc.planned_delivery_date", bo.getPlannedDeliveryDate());
// 模糊查询(设备名称)
qw.like(StringUtils.isNotBlank(bo.getEquipmentName()), "oc.equipment_name", bo.getEquipmentName());
// 按创建时间降序排序
qw.orderByDesc("oc.create_time");
// 逻辑删除
qw.eq("oc.del_flag", 0);
return qw;
}
/**
* 查询工艺卡主列表
*/

View File

@@ -27,6 +27,36 @@
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="selectVoListByOrderIds" resultType="com.ruoyi.oa.domain.vo.OaDeliveryOrderDetailVo">
SELECT
detail_id AS detailId,
order_id AS orderId,
sequence,
box_no_total AS boxNoTotal,
equipment_station_no AS equipmentStationNo,
equipment_name AS equipmentName,
model_spec AS modelSpec,
quantity,
unit,
packaging_type AS packagingType,
net_weight AS netWeight,
gross_weight AS grossWeight,
volume,
box_size AS boxSize,
detail_remark AS detailRemark,
del_flag AS delFlag,
remark,
create_by AS createBy,
create_time AS createTime,
update_by AS updateBy,
update_time AS updateTime
FROM oa_delivery_order_detail
WHERE del_flag = '0' AND order_id IN
<foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
#{orderId}
</foreach>
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -29,6 +29,33 @@
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="selectVoPagePlus" resultType="com.ruoyi.oa.domain.vo.OaDeliveryOrderVo">
SELECT
odo.order_id AS orderId,
odo.delivery_order_no AS deliveryOrderNo,
odo.project_id AS projectId,
odo.contract_no AS contractNo,
odo.user_contract_no AS userContractNo,
odo.procurement_no AS procurementNo,
odo.delivery_destination AS deliveryDestination,
odo.delivery_address AS deliveryAddress,
odo.receiver AS receiver,
odo.receiver_phone AS receiverPhone,
odo.supplier_fullname AS supplierFullname,
odo.supplier_contact AS supplierContact,
odo.supplier_phone AS supplierPhone,
odo.receiving_company AS receivingCompany,
odo.actual_receiver AS actualReceiver,
odo.construction_company AS constructionCompany,
odo.delivery_remark AS deliveryRemark,
p.project_name AS projectName,
p.project_code AS projectCode,
p.project_num AS projectNum
FROM oa_delivery_order odo
LEFT JOIN sys_oa_project p ON odo.project_id = p.project_id
${ew.customSqlSegment}
</select>
</mapper>

View File

@@ -23,5 +23,30 @@
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="selectVoListByCardIds" resultType="com.ruoyi.oa.domain.vo.OaProcessCardDetailVo">
SELECT
detail_id AS detailId,
card_id AS cardId,
sequence,
process_name AS processName,
process_detail AS processDetail,
work_responsible_person AS workResponsiblePerson,
process_start_time AS processStartTime,
process_end_time AS processEndTime,
inspector,
unqualified_content AS unqualifiedContent,
del_flag AS delFlag,
remark,
create_by AS createBy,
create_time AS createTime,
update_by AS updateBy,
update_time AS updateTime
FROM oa_process_card_detail
WHERE del_flag = '0' AND card_id IN
<foreach collection="cardIds" item="cardId" open="(" separator="," close=")">
#{cardId}
</foreach>
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -19,6 +19,22 @@
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<select id="selectVoPagePlus" resultType="com.ruoyi.oa.domain.vo.OaProcessCardVo">
SELECT
oc.card_id AS cardId,
oc.project_id AS projectId,
oc.equipment_name AS equipmentName,
oc.equipment_quantity AS equipmentQuantity,
oc.manufacturing_leader AS manufacturingLeader,
oc.operation_leader AS operationLeader,
oc.planned_delivery_date AS plannedDeliveryDate,
p.project_name AS projectName,
p.project_code AS projectCode,
p.project_num AS projectNum,
FROM oa_process_card oc
LEFT JOIN sys_oa_project p ON oc.project_id = p.project_id
${ew.customSqlSegment}
</select>
</mapper>