1.0.36 采购信息关联采购物料,根据项目ID查询预算、合同物料

dev
yinq 4 weeks ago
parent 0e5f92055f
commit d94edd6914

@ -18,6 +18,7 @@ import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo;
import org.dromara.oa.erp.domain.bo.ErpProjectPurchaseBo;
import org.dromara.oa.erp.service.IErpProjectPurchaseService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -124,4 +125,18 @@ public class ErpProjectPurchaseController extends BaseController {
return R.ok(list);
}
/**
* ID
* 10
*/
@SaCheckPermission("oa/erp:projectPurchase:query")
@GetMapping("/getContractMaterialsByProjectId/{projectId}/{spareFlag}")
public R<List<ErpProjectPurchaseMaterialVo>> getContractMaterialsByProjectId(@NotNull(message = "项目ID不能为空")
@PathVariable("projectId") Long projectId,
@NotBlank(message = "备件标识不能为空")
@PathVariable("spareFlag") String spareFlag) {
List<ErpProjectPurchaseMaterialVo> materials = erpProjectPurchaseService.getProjectMaterialsByProjectId(projectId, spareFlag);
return R.ok(materials);
}
}

@ -24,7 +24,7 @@ public class ErpProjectPurchase extends TenantEntity {
/**
* ID
*/
@TableId(value = "project_purchase_id", type = IdType.AUTO)
@TableId(value = "project_purchase_id", type = IdType.ASSIGN_ID)
private Long projectPurchaseId;
/**
@ -37,6 +37,11 @@ public class ErpProjectPurchase extends TenantEntity {
*/
private String projectCode;
/**
*
*/
private String purchaseCode;
/**
*
*/

@ -27,7 +27,7 @@ public class ErpProjectPurchaseMaterial extends TenantEntity {
/**
* ID
*/
@TableId(value = "purchase_material_id", type = IdType.AUTO)
@TableId(value = "purchase_material_id", type = IdType.ASSIGN_ID)
private Long purchaseMaterialId;
/**

@ -9,7 +9,9 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt;
import org.dromara.oa.erp.domain.ErpProjectPurchaseMaterial;
import java.util.List;
import java.util.Map;
/**
@ -39,6 +41,11 @@ public class ErpProjectPurchaseBo extends BaseEntity {
@NotBlank(message = "项目号不能为空", groups = { AddGroup.class, EditGroup.class })
private String projectCode;
/**
*
*/
private String purchaseCode;
/**
*
*/
@ -126,5 +133,9 @@ public class ErpProjectPurchaseBo extends BaseEntity {
*/
private RemoteFlowInstanceBizExt bizExt;
/**
*
*/
private List<ErpProjectPurchaseMaterial> purchaseMaterialList;
}

@ -143,5 +143,19 @@ public class ErpProjectPurchaseMaterialVo implements Serializable {
@ExcelDictFormat(dictType = "active_flag")
private String activeFlag;
/**
*
*/
private String relationMaterialCode;
/**
*
*/
private String relationMaterialName;
/**
*
*/
private String purchaseMaterialName;
}

@ -46,30 +46,66 @@ public class ErpProjectPurchaseVo implements Serializable {
@ExcelProperty(value = "项目号")
private String projectCode;
/**
*
*/
@ExcelProperty(value = "采购编号")
private String purchaseCode;
/**
*
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
*
*/
@ExcelProperty(value = "项目经理")
private Long managerId;
/**
*
*/
@ExcelProperty(value = "项目经理名称")
private String managerName;
/**
*
*/
@ExcelProperty(value = "部门负责人")
private Long chargeId;
/**
*
*/
@ExcelProperty(value = "部门负责人名称")
private String chargeName;
/**
*
*/
@ExcelProperty(value = "分管副总")
private Long deputyId;
/**
*
*/
@ExcelProperty(value = "分管副总名称")
private String deputyName;
/**
*
*/
@ExcelProperty(value = "提报人")
private Long reporterId;
/**
*
*/
@ExcelProperty(value = "提报人名称")
private String reporterName;
/**
*
*/

@ -5,6 +5,8 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.oa.erp.domain.ErpProjectPurchase;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@ -24,6 +26,10 @@ public interface ErpProjectPurchaseMapper extends BaseMapperPlus<ErpProjectPurch
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
public Page<ErpProjectPurchaseVo> selectCustomErpProjectPurchaseVoList(@Param("page") Page<ErpProjectPurchaseVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectPurchase> queryWrapper);
/**
@ -32,6 +38,10 @@ public interface ErpProjectPurchaseMapper extends BaseMapperPlus<ErpProjectPurch
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
public List<ErpProjectPurchaseVo> selectCustomErpProjectPurchaseVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectPurchase> queryWrapper);
}

@ -34,4 +34,20 @@ public interface ErpProjectPurchaseMaterialMapper extends BaseMapperPlus<ErpProj
*/
public List<ErpProjectPurchaseMaterialVo> selectCustomErpProjectPurchaseMaterialVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectPurchaseMaterial> queryWrapper);
/**
* ID
*
* @param projectId ID
* @return
*/
List<ErpProjectPurchaseMaterialVo> selectBudgetMaterialsByProjectId(@Param("projectId") Long projectId, @Param("spareFlag") String spareFlag);
/**
* ID
*
* @param projectId ID
* @return
*/
List<ErpProjectPurchaseMaterialVo> selectContractMaterialsByProjectId(@Param("projectId") Long projectId, @Param("spareFlag") String spareFlag);
}

@ -2,6 +2,7 @@ package org.dromara.oa.erp.service;
import org.dromara.oa.erp.domain.ErpProjectPurchase;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo;
import org.dromara.oa.erp.domain.bo.ErpProjectPurchaseBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
@ -74,4 +75,9 @@ public interface IErpProjectPurchaseService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ID
*/
List<ErpProjectPurchaseMaterialVo> getProjectMaterialsByProjectId(Long projectId, String spareFlag);
}

@ -53,7 +53,7 @@ public class ErpProjectPurchaseMaterialServiceImpl implements IErpProjectPurchas
@Override
public TableDataInfo<ErpProjectPurchaseMaterialVo> queryPageList(ErpProjectPurchaseMaterialBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpProjectPurchaseMaterial> lqw = buildQueryWrapper(bo);
Page<ErpProjectPurchaseMaterialVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Page<ErpProjectPurchaseMaterialVo> result = baseMapper.selectCustomErpProjectPurchaseMaterialVoList(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@ -66,7 +66,7 @@ public class ErpProjectPurchaseMaterialServiceImpl implements IErpProjectPurchas
@Override
public List<ErpProjectPurchaseMaterialVo> queryList(ErpProjectPurchaseMaterialBo bo) {
MPJLambdaWrapper<ErpProjectPurchaseMaterial> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
return baseMapper.selectCustomErpProjectPurchaseMaterialVoList(lqw);
}
private MPJLambdaWrapper<ErpProjectPurchaseMaterial> buildQueryWrapper(ErpProjectPurchaseMaterialBo bo) {

@ -17,22 +17,24 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.oa.erp.domain.ErpProjectPurchase;
import org.dromara.oa.erp.domain.ErpProjectPurchaseMaterial;
import org.dromara.oa.erp.domain.bo.ErpProjectPurchaseBo;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo;
import org.dromara.oa.erp.mapper.ErpProjectPurchaseMapper;
import org.dromara.oa.erp.mapper.ErpProjectPurchaseMaterialMapper;
import org.dromara.oa.erp.service.IErpProjectPurchaseService;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
* Service
@ -47,9 +49,14 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
private final ErpProjectPurchaseMapper baseMapper;
private final ErpProjectPurchaseMaterialMapper purchaseMaterialMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference()
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
*
@ -117,12 +124,24 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ErpProjectPurchaseBo bo) {
ErpProjectPurchase add = MapstructUtils.convert(bo, ErpProjectPurchase.class);
assert add != null;
validEntityBeforeSave(add);
String purchaseCode = remoteCodeRuleService.selectCodeRuleCode("1007");
add.setPurchaseCode(purchaseCode);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setProjectPurchaseId(add.getProjectPurchaseId());
// 保存物料列表
List<ErpProjectPurchaseMaterial> purchaseMaterialList = bo.getPurchaseMaterialList();
if (purchaseMaterialList != null && !purchaseMaterialList.isEmpty()) {
for (ErpProjectPurchaseMaterial material : purchaseMaterialList) {
material.setProjectPurchaseId(add.getProjectPurchaseId());
purchaseMaterialMapper.insert(material);
}
}
}
return flag;
}
@ -181,10 +200,39 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(ErpProjectPurchaseBo bo) {
ErpProjectPurchase update = MapstructUtils.convert(bo, ErpProjectPurchase.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
boolean flag = baseMapper.updateById(update) > 0;
if (flag) {
List<ErpProjectPurchaseMaterial> purchaseMaterialList = bo.getPurchaseMaterialList();
MPJLambdaWrapper<ErpProjectPurchaseMaterial> lqwRecord = JoinWrappers.lambda(ErpProjectPurchaseMaterial.class);
lqwRecord.eq(ErpProjectPurchaseMaterial::getProjectPurchaseId, bo.getProjectPurchaseId());
List<ErpProjectPurchaseMaterial> oldMaterialList = purchaseMaterialMapper.selectList(lqwRecord);
if (purchaseMaterialList != null && !purchaseMaterialList.isEmpty()) {
for (ErpProjectPurchaseMaterial material : purchaseMaterialList) {
material.setProjectPurchaseId(bo.getProjectPurchaseId());
purchaseMaterialMapper.insertOrUpdate(material);
}
Set<Long> existingMaterialIds = purchaseMaterialList.stream()
.map(ErpProjectPurchaseMaterial::getPurchaseMaterialId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
List<ErpProjectPurchaseMaterial> toDeleteList = oldMaterialList.stream()
.filter(material -> !existingMaterialIds.contains(material.getPurchaseMaterialId()))
.toList();
for (ErpProjectPurchaseMaterial toDelete : toDeleteList) {
purchaseMaterialMapper.deleteById(toDelete.getPurchaseMaterialId());
}
} else {
// 如果新列表为空,删除所有旧物料
for (ErpProjectPurchaseMaterial oldMaterial : oldMaterialList) {
purchaseMaterialMapper.deleteById(oldMaterial.getPurchaseMaterialId());
}
}
}
return flag;
}
/**
@ -209,6 +257,29 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
return baseMapper.deleteByIds(ids) > 0;
}
/**
* ID
*
* @param projectId ID
* @param spareFlag 1-0-
* @return
*/
@Override
public List<ErpProjectPurchaseMaterialVo> getProjectMaterialsByProjectId(Long projectId, String spareFlag) {
if (projectId == null) {
return Collections.emptyList();
}
List<ErpProjectPurchaseMaterialVo> list = new ArrayList<>();
if ("0".equals(spareFlag)) {
// 非备件-预算物料
list = purchaseMaterialMapper.selectBudgetMaterialsByProjectId(projectId, spareFlag);
} else if ("1".equals(spareFlag)) {
// 备件-合同物料
list = purchaseMaterialMapper.selectContractMaterialsByProjectId(projectId, spareFlag);
}
return list;
}
/**
*
*
@ -225,10 +296,10 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
purchase.setProjectPurchaseStatus(OAStatusEnum.COMPLETED.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
purchase.setProjectPurchaseStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
purchase.setProjectPurchaseStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(purchase);

@ -7,32 +7,43 @@
</resultMap>
<select id="selectCustomErpProjectPurchaseVoList" resultMap="ErpProjectPurchaseResult">
select project_purchase_id,
tenant_id,
project_id,
project_code,
manager_id,
charge_id,
deputy_id,
version,
reporter_id,
consignee_user,
consignee_address,
consignee_contact,
project_purchase_status,
flow_status,
sort_order,
relation_id,
remark,
spare_flag,
active_flag,
del_flag,
create_dept,
create_by,
create_time,
update_by,
update_time
select t.project_purchase_id,
t.tenant_id,
t.project_id,
t.project_code,
t.purchase_code,
t.manager_id,
t.charge_id,
t.deputy_id,
t.version,
t.reporter_id,
t.consignee_user,
t.consignee_address,
t.consignee_contact,
t.project_purchase_status,
t.flow_status,
t.sort_order,
t.relation_id,
t.remark,
t.spare_flag,
t.active_flag,
t.del_flag,
t.create_dept,
t.create_by,
t.create_time,
t.update_by,
t.update_time,
p.project_name,
u1.nick_name as managerName,
u2.nick_name as chargeName,
u3.nick_name as deputyName,
u4.nick_name as reporterName
from erp_project_purchase t
left join erp_project_info p on t.project_id = p.project_id
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u2 on t.charge_id = u2.user_id
left join sys_user u3 on t.deputy_id = u3.user_id
left join sys_user u4 on t.reporter_id = u4.user_id
${ew.getCustomSqlSegment}
</select>

@ -1,14 +1,102 @@
<?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">
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.oa.erp.mapper.ErpProjectPurchaseMaterialMapper">
<resultMap type="org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo" id="ErpProjectPurchaseMaterialResult">
</resultMap>
<select id="selectCustomErpProjectPurchaseMaterialVoList" resultMap="ErpProjectPurchaseMaterialResult">
select purchase_material_id, tenant_id, project_purchase_id, relation_details_id, spare_flag, purchase_plan_flag, material_flag, material_id, relation_material_id, material_code, material_name, specification_description, unit_id, need_purchase_amount, purchase_amount, arrival_time, serial_number, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time from erp_project_purchase_material t
select t.purchase_material_id,
t.tenant_id,
t.project_purchase_id,
t.relation_details_id,
t.spare_flag,
t.purchase_plan_flag,
t.material_flag,
t.material_id,
t.relation_material_id,
t.material_code,
t.material_name,
t.specification_description,
t.unit_id,
t.need_purchase_amount,
t.purchase_amount,
t.arrival_time,
t.serial_number,
t.remark,
t.active_flag,
t.del_flag,
t.create_dept,
t.create_by,
t.create_time,
t.update_by,
t.update_time,
COALESCE(bmc.material_code, cm_m.material_code) as relation_material_code,
COALESCE(bmc.material_name, cm.product_name) as relation_material_name,
u.unit_name
from erp_project_purchase_material t
left join erp_budget_material_cost bmc on bmc.material_cost_id = t.relation_details_id and t.spare_flag = '0'
left join erp_contract_material cm on cm.contract_material_id = t.relation_details_id and t.spare_flag = '1'
left join base_material_info m on m.material_id = t.material_id
left join base_material_info cm_m on cm_m.material_id = cm.material_id
left join base_relation_material r on r.relation_material_id = t.relation_material_id
left join base_unit_info u on u.unit_id = t.unit_id
${ew.getCustomSqlSegment}
</select>
<select id="selectContractMaterialsByProjectId"
resultType="org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo">
select t.contract_material_id as relation_details_id,
1 as spare_flag,
null as purchase_plan_flag,
t.material_flag,
t.material_id,
t.relation_material_id,
m.material_code as material_code,
COALESCE(m.material_name, t.product_name) as material_name,
t.specification_description,
t.unit_id,
u.unit_name,
t.amount as need_purchase_amount,
t.amount as purchase_amount,
m.material_code as relation_material_code,
COALESCE(m.material_name, t.product_name) as relation_material_name
from erp_contract_material t
left join erp_project_contracts pc on pc.contract_id = t.contract_id and pc.del_flag = '0'
left join base_material_info m on m.material_id = t.material_id
left join base_unit_info u on u.unit_id = t.unit_id
where t.del_flag = '0'
and pc.project_id = #{projectId}
</select>
<select id="selectBudgetMaterialsByProjectId"
resultType="org.dromara.oa.erp.domain.vo.ErpProjectPurchaseMaterialVo">
select null as purchase_material_id,
null as project_purchase_id,
t.material_cost_id as relation_details_id,
#{spareFlag} as spare_flag,
null as purchase_plan_flag,
null as material_flag,
t.materiel_id as material_id,
t.relation_materiel_id as relation_material_id,
t.materiel_code as material_code,
t.materiel_name as material_name,
t.materiel_code as specification_description,
t.unit_id,
t.amount as need_purchase_amount,
t.amount as purchase_amount,
null as arrival_time,
null as serial_number,
t.remark,
null as active_flag,
t.materiel_code as relation_material_code,
t.materiel_name as relation_material_name,
t.materiel_name as purchase_material_name
from erp_budget_material_cost t
where t.del_flag = '0'
and t.project_id = #{projectId}
order by t.material_cost_id asc
</select>
</mapper>

Loading…
Cancel
Save