Merge remote-tracking branch 'origin/dev' into dev

dev
wanghao 4 weeks ago
commit 4040437030

@ -0,0 +1,136 @@
package org.dromara.oa.erp.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
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.ErpProjectAcceptanceVo;
import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo;
import org.dromara.oa.erp.service.IErpProjectAcceptanceService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
*
* 访:/oa/erp/projectAcceptance
*
* @author Yinq
* @date 2025-11-12
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/projectAcceptance")
public class ErpProjectAcceptanceController extends BaseController {
private final IErpProjectAcceptanceService erpProjectAcceptanceService;
/**
*
*/
@SaCheckPermission("oa/erp:projectAcceptance:list")
@GetMapping("/list")
public TableDataInfo<ErpProjectAcceptanceVo> list(ErpProjectAcceptanceBo bo, PageQuery pageQuery) {
return erpProjectAcceptanceService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("oa/erp:projectAcceptance:export")
@Log(title = "项目验收确认", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpProjectAcceptanceBo bo, HttpServletResponse response) {
List<ErpProjectAcceptanceVo> list = erpProjectAcceptanceService.queryList(bo);
ExcelUtil.exportExcel(list, "项目验收确认", ErpProjectAcceptanceVo.class, response);
}
/**
*
*
* @param acceptanceId
*/
@SaCheckPermission("oa/erp:projectAcceptance:query")
@GetMapping("/{acceptanceId}")
public R<ErpProjectAcceptanceVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("acceptanceId") Long acceptanceId) {
return R.ok(erpProjectAcceptanceService.queryById(acceptanceId));
}
/**
*
*/
@SaCheckPermission("oa/erp:projectAcceptance:add")
@Log(title = "项目验收确认", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpProjectAcceptanceBo bo) {
return toAjax(erpProjectAcceptanceService.insertByBo(bo));
}
/**
*
*/
@SaCheckPermission("oa/erp:projectAcceptance:edit")
@Log(title = "项目验收确认", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpProjectAcceptanceBo bo) {
return toAjax(erpProjectAcceptanceService.updateByBo(bo));
}
/**
*
*
* @param acceptanceIds
*/
@SaCheckPermission("oa/erp:projectAcceptance:remove")
@Log(title = "项目验收确认", businessType = BusinessType.DELETE)
@DeleteMapping("/{acceptanceIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] acceptanceIds) {
return toAjax(erpProjectAcceptanceService.deleteWithValidByIds(java.util.Arrays.asList(acceptanceIds), true));
}
/**
* ID
*/
@SaCheckPermission("oa/erp:projectAcceptance:query")
@GetMapping("/prepareByProjectId/{projectId}")
public R<ErpProjectAcceptanceVo> prepareByProjectId(@PathVariable Long projectId) {
return R.ok(erpProjectAcceptanceService.prepareByProjectId(projectId));
}
/**
*
*/
@SaCheckPermission("oa/erp:projectAcceptance:add")
@Log(title = "项目验收确认", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/submitAndFlowStart")
public R<ErpProjectAcceptanceVo> submitAndFlowStart(@Validated(AddGroup.class) @RequestBody ErpProjectAcceptanceBo bo) {
return R.ok(erpProjectAcceptanceService.submitAndFlowStart(bo));
}
/**
*
*/
@GetMapping("/getErpProjectAcceptanceList")
public R<List<ErpProjectAcceptanceVo>> getErpProjectAcceptanceList(ErpProjectAcceptanceBo bo) {
List<ErpProjectAcceptanceVo> list = erpProjectAcceptanceService.queryList(bo);
return R.ok(list);
}
}

@ -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);
}
}

@ -0,0 +1,136 @@
package org.dromara.oa.erp.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
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.ErpProjectReceivingVo;
import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo;
import org.dromara.oa.erp.service.IErpProjectReceivingService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
*
* 访:/oa/erp/projectReceiving
*
* @author Yinq
* @date 2025-11-12
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/erp/projectReceiving")
public class ErpProjectReceivingController extends BaseController {
private final IErpProjectReceivingService erpProjectReceivingService;
/**
*
*/
@SaCheckPermission("oa/erp:projectReceiving:list")
@GetMapping("/list")
public TableDataInfo<ErpProjectReceivingVo> list(ErpProjectReceivingBo bo, PageQuery pageQuery) {
return erpProjectReceivingService.queryPageList(bo, pageQuery);
}
/**
*
*/
@SaCheckPermission("oa/erp:projectReceiving:export")
@Log(title = "项目收货确认", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ErpProjectReceivingBo bo, HttpServletResponse response) {
List<ErpProjectReceivingVo> list = erpProjectReceivingService.queryList(bo);
ExcelUtil.exportExcel(list, "项目收货确认", ErpProjectReceivingVo.class, response);
}
/**
*
*
* @param receivingId
*/
@SaCheckPermission("oa/erp:projectReceiving:query")
@GetMapping("/{receivingId}")
public R<ErpProjectReceivingVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("receivingId") Long receivingId) {
return R.ok(erpProjectReceivingService.queryById(receivingId));
}
/**
*
*/
@SaCheckPermission("oa/erp:projectReceiving:add")
@Log(title = "项目收货确认", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpProjectReceivingBo bo) {
return toAjax(erpProjectReceivingService.insertByBo(bo));
}
/**
*
*/
@SaCheckPermission("oa/erp:projectReceiving:edit")
@Log(title = "项目收货确认", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpProjectReceivingBo bo) {
return toAjax(erpProjectReceivingService.updateByBo(bo));
}
/**
*
*
* @param receivingIds
*/
@SaCheckPermission("oa/erp:projectReceiving:remove")
@Log(title = "项目收货确认", businessType = BusinessType.DELETE)
@DeleteMapping("/{receivingIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] receivingIds) {
return toAjax(erpProjectReceivingService.deleteWithValidByIds(java.util.Arrays.asList(receivingIds), true));
}
/**
* ID
*/
@SaCheckPermission("oa/erp:projectReceiving:query")
@GetMapping("/prepareByProjectId/{projectId}")
public R<ErpProjectReceivingVo> prepareByProjectId(@PathVariable Long projectId) {
return R.ok(erpProjectReceivingService.prepareByProjectId(projectId));
}
/**
*
*/
@SaCheckPermission("oa/erp:projectReceiving:add")
@Log(title = "项目收货确认", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/submitAndFlowStart")
public R<ErpProjectReceivingVo> submitAndFlowStart(@Validated(AddGroup.class) @RequestBody ErpProjectReceivingBo bo) {
return R.ok(erpProjectReceivingService.submitAndFlowStart(bo));
}
/**
*
*/
@GetMapping("/getErpProjectReceivingList")
public R<List<ErpProjectReceivingVo>> getErpProjectReceivingList(ErpProjectReceivingBo bo) {
List<ErpProjectReceivingVo> list = erpProjectReceivingService.queryList(bo);
return R.ok(list);
}
}

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* erp_budget_detail
@ -44,12 +45,12 @@ public class ErpBudgetDetail{
/**
* ()
*/
private Long budgetCost;
private BigDecimal budgetCost;
/**
* ()
*/
private Long reduceBudgetCost;
private BigDecimal reduceBudgetCost;
/**
* ID

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* erp_budget_info
@ -90,32 +91,32 @@ public class ErpBudgetInfo extends TenantEntity {
/**
* ()
*/
private Long contractAmount;
private BigDecimal contractAmount;
/**
* ()
*/
private Long netContractAmount;
private BigDecimal netContractAmount;
/**
* ()
*/
private Long budgetCost;
private BigDecimal budgetCost;
/**
* 1001%,1
*/
private Long budgetRate;
private BigDecimal budgetRate;
/**
* ()
*/
private Long reduceBudgetCost;
private BigDecimal reduceBudgetCost;
/**
*
*/
private Long reduceBudgetRate;
private BigDecimal reduceBudgetRate;
/**
*

@ -40,22 +40,22 @@ public class ErpBudgetMaterialCost extends TenantEntity {
/**
* IDbase_material_info
*/
private Long materielId;
private Long materialId;
/**
* SAP
*/
private String materielCode;
private String materialCode;
/**
* SAP
*/
private String materielName;
private String materialName;
/**
* ID?
*/
private Long relationMaterielId;
private Long relationMaterialId;
/**
* ,base_unit_info

@ -42,6 +42,11 @@ public class ErpContractInfo extends TenantEntity {
*/
private String contractCode;
/**
*
*/
private String customerContractCode;
/**
*
*/

@ -0,0 +1,118 @@
package org.dromara.oa.erp.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* erp_project_acceptance
*
* @author Yinq
* @date 2025-11-12
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_project_acceptance")
public class ErpProjectAcceptance extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "acceptance_id", type = IdType.ASSIGN_ID)
private Long acceptanceId;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
*
*/
private Long managerId;
/**
*
*/
@TableField(exist = false)
private String projectManagerName;
/**
*
*/
private Date acceptanceDate;
/**
*
*/
private String ossId;
/**
*
*/
private Long chargeId;
/**
*
*/
private Long deputyId;
/**
*
*/
@TableField(exist = false)
private String chargeName;
/**
*
*/
@TableField(exist = false)
private String deputyName;
/**
*
*/
private String remark;
/**
*
*/
private String flowStatus;
/**
* (1 2 3)
*/
private String acceptanceStatus;
/**
* 0 1
*/
@TableLogic
private String delFlag;
/**
* acceptance_code
*/
@TableField("acceptance_code")
private String acceptanceCode;
}

@ -31,6 +31,11 @@ public class ErpProjectChange extends TenantEntity {
@TableId(value = "project_change_id", type = IdType.ASSIGN_ID)
private Long projectChangeId;
/**
*
*/
private String projectChangeCode;
/**
* ID
*/

@ -32,6 +32,11 @@ public class ErpProjectPlan extends TenantEntity {
*/
private Long projectId;
/**
*
*/
private String projectPlanCode;
/**
*
*/
@ -67,6 +72,11 @@ public class ErpProjectPlan extends TenantEntity {
*/
private Long contractId;
/**
* ID
*/
private String ossId;
/**
*
*/
@ -89,4 +99,22 @@ public class ErpProjectPlan extends TenantEntity {
@TableField(exist = false )
private String createName;
/**
*
*/
@TableField(exist = false )
private String managerName;
/**
*
*/
@TableField(exist = false )
private String chargeName;
/**
*
*/
@TableField(exist = false )
private String managerDeptName;
}

@ -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;
/**

@ -0,0 +1,118 @@
package org.dromara.oa.erp.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* erp_project_receiving
*
* @author Yinq
* @date 2025-11-12
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("erp_project_receiving")
public class ErpProjectReceiving extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "receiving_id", type = IdType.ASSIGN_ID)
private Long receivingId;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
* ID
*/
private Long projectId;
/**
*
*/
private Long managerId;
/**
*
*/
private Date arrivalDate;
/**
*
*/
private String ossId;
/**
*
*/
@TableField(exist = false)
private String projectManagerName;
/**
*
*/
private Long chargeId;
/**
*
*/
private Long deputyId;
/**
*
*/
@TableField(exist = false)
private String chargeName;
/**
*
*/
@TableField(exist = false)
private String deputyName;
/**
*
*/
private String remark;
/**
*
*/
private String flowStatus;
/**
* (1 2 3)
*/
private String receivingStatus;
/**
* 0 1
*/
@TableLogic
private String delFlag;
/**
* receiving_code
*/
@TableField("receiving_code")
private String receivingCode;
}

@ -9,6 +9,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* erp_budget_detail
*
@ -46,12 +48,12 @@ public class ErpBudgetDetailBo {
/**
* ()
*/
private Long budgetCost;
private BigDecimal budgetCost;
/**
* ()
*/
private Long reduceBudgetCost;
private BigDecimal reduceBudgetCost;
/**
* ID

@ -1,7 +1,6 @@
package org.dromara.oa.erp.domain.bo;
import org.dromara.oa.erp.domain.ErpBudgetDetail;
import org.dromara.oa.erp.domain.ErpBudgetInfo;
import org.dromara.oa.erp.domain.*;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
@ -9,8 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.dromara.oa.erp.domain.ErpBudgetMaterialCost;
import java.math.BigDecimal;
import java.util.List;
/**
@ -97,32 +96,32 @@ public class ErpBudgetInfoBo extends BaseEntity {
/**
* ()
*/
private Long contractAmount;
private BigDecimal contractAmount;
/**
* ()
*/
private Long netContractAmount;
private BigDecimal netContractAmount;
/**
* ()
*/
private Long budgetCost;
private BigDecimal budgetCost;
/**
* 1001%,1
*/
private Long budgetRate;
private BigDecimal budgetRate;
/**
* ()
*/
private Long reduceBudgetCost;
private BigDecimal reduceBudgetCost;
/**
*
*/
private Long reduceBudgetRate;
private BigDecimal reduceBudgetRate;
/**
*
@ -168,4 +167,11 @@ public class ErpBudgetInfoBo extends BaseEntity {
private List<ErpBudgetMaterialCost> erpBudgetMaterialCostList;
private List<ErpBudgetLaborCost> erpBudgetLaborCostList;
private List<ErpBudgetInstallCost> erpBudgetInstallCostList;
private List<ErpBudgetTravelCost> erpBudgetTravelCostList;
private List<ErpBudgetOtherCost> erpBudgetOtherCostList;
}

@ -40,22 +40,22 @@ public class ErpBudgetMaterialCostBo extends BaseEntity {
/**
* IDbase_material_info
*/
private Long materielId;
private Long materialId;
/**
* SAP
*/
private String materielCode;
private String materialCode;
/**
* SAP
*/
private String materielName;
private String materialName;
/**
* ID?
*/
private Long relationMaterielId;
private Long relationMaterialId;
/**
* ,base_unit_info

@ -44,6 +44,11 @@ public class ErpContractInfoBo extends BaseEntity {
*/
private String contractCode;
/**
*
*/
private String customerContractCode;
/**
*
*/

@ -0,0 +1,125 @@
package org.dromara.oa.erp.domain.bo;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.oa.erp.domain.ErpProjectAcceptance;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt;
/**
* erp_project_acceptance
*
* @author Yinq
* @date 2025-11-12
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ErpProjectAcceptance.class, reverseConvertGenerate = false)
public class ErpProjectAcceptanceBo extends BaseEntity {
/**
* ID
*/
@NotNull(message = "验收确认ID不能为空", groups = { EditGroup.class })
private Long acceptanceId;
/**
* ID
*/
private Long projectId;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
*
*/
private Long managerId;
/**
*
*/
private Date acceptanceDate;
/**
*
*/
private String ossId;
/**
* acceptance_code
*/
private String acceptanceCode;
/**
*
*/
private Long chargeId;
/**
*
*/
private Long deputyId;
/**
*
*/
private String remark;
/**
*
*/
private String flowCode;
/**
*
*/
private String handler;
/**
*
*/
private Map<String, Object> variables;
/**
*
*/
private RemoteFlowInstanceBizExt bizExt;
/**
* {'entity': {}}
*/
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
public RemoteFlowInstanceBizExt getBizExt() {
if (ObjectUtil.isNull(bizExt)) {
bizExt = new RemoteFlowInstanceBizExt();
}
return bizExt;
}
}

@ -34,6 +34,11 @@ public class ErpProjectChangeBo extends BaseEntity {
@NotNull(message = "项目变更ID不能为空", groups = { EditGroup.class })
private Long projectChangeId;
/**
*
*/
private String projectChangeCode;
/**
* ID
*/

@ -37,6 +37,11 @@ public class ErpProjectPlanBo extends BaseEntity {
*/
private Long projectId;
/**
*
*/
private String projectPlanCode;
/**
*
*/
@ -72,6 +77,11 @@ public class ErpProjectPlanBo extends BaseEntity {
*/
private Long contractId;
/**
* ID
*/
private String ossId;
/**
*
*/

@ -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;
}

@ -0,0 +1,122 @@
package org.dromara.oa.erp.domain.bo;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.oa.erp.domain.ErpProjectReceiving;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt;
/**
* erp_project_receiving
*
* @author Yinq
* @date 2025-11-12
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ErpProjectReceiving.class, reverseConvertGenerate = false)
public class ErpProjectReceivingBo extends BaseEntity {
/**
* ID
*/
private Long receivingId;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
* ID
*/
private Long projectId;
/**
*
*/
private Long managerId;
/**
*
*/
private Date arrivalDate;
/**
*
*/
private String ossId;
/**
* receiving_code
*/
private String receivingCode;
/**
*
*/
private Long chargeId;
/**
*
*/
private Long deputyId;
/**
*
*/
private String remark;
/**
*
*/
private String flowCode;
/**
*
*/
private String handler;
/**
*
*/
private Map<String, Object> variables;
/**
*
*/
private RemoteFlowInstanceBizExt bizExt;
/**
* {'entity': {}}
*/
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
public RemoteFlowInstanceBizExt getBizExt() {
if (ObjectUtil.isNull(bizExt)) {
bizExt = new RemoteFlowInstanceBizExt();
}
return bizExt;
}
}

@ -10,6 +10,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -56,13 +57,13 @@ public class ErpBudgetDetailVo implements Serializable {
* ()
*/
@ExcelProperty(value = "预算成本(元)")
private Long budgetCost;
private BigDecimal budgetCost;
/**
* ()
*/
@ExcelProperty(value = "降成本预算成本(元)")
private Long reduceBudgetCost;
private BigDecimal reduceBudgetCost;
/**
* ID

@ -10,6 +10,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -112,38 +113,38 @@ public class ErpBudgetInfoVo implements Serializable {
* ()
*/
@ExcelProperty(value = "合同额(元)")
private Long contractAmount;
private BigDecimal contractAmount;
/**
* ()
*/
@ExcelProperty(value = "合同净额(元)")
private Long netContractAmount;
private BigDecimal netContractAmount;
/**
* ()
*/
@ExcelProperty(value = "预算成本(元)")
private Long budgetCost;
private BigDecimal budgetCost;
/**
* 1001%,1
*/
@ExcelProperty(value = "预算毛利率乘以100保存", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=1%,保存1")
private Long budgetRate;
private BigDecimal budgetRate;
/**
* ()
*/
@ExcelProperty(value = "降成本后预算成本(元)")
private Long reduceBudgetCost;
private BigDecimal reduceBudgetCost;
/**
*
*/
@ExcelProperty(value = "降成本后预算毛利率")
private Long reduceBudgetRate;
private BigDecimal reduceBudgetRate;
/**
*

@ -50,25 +50,25 @@ public class ErpBudgetMaterialCostVo implements Serializable {
* IDbase_material_info
*/
@ExcelProperty(value = "物料ID关联base_material_info")
private Long materielId;
private Long materialId;
/**
* SAP
*/
@ExcelProperty(value = "SAP物料编码")
private String materielCode;
private String materialCode;
/**
* SAP
*/
@ExcelProperty(value = "SAP物料名称")
private String materielName;
private String materialName;
/**
* ID?
*/
@ExcelProperty(value = "销售物料ID?")
private Long relationMaterielId;
private Long relationMaterialId;
/**
* ,base_unit_info

@ -51,6 +51,12 @@ public class ErpContractInfoVo implements Serializable {
@ExcelProperty(value = "合同编号")
private String contractCode;
/**
*
*/
@ExcelProperty(value = "客户合同编号")
private String customerContractCode;
/**
*
*/

@ -0,0 +1,130 @@
package org.dromara.oa.erp.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.oa.erp.domain.ErpProjectAcceptance;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* erp_project_acceptance
*
* @author Yinq
* @date 2025-11-12
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ErpProjectAcceptance.class)
public class ErpProjectAcceptanceVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "验收确认ID")
private Long acceptanceId;
/**
* ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
*
*/
@ExcelProperty(value = "项目号")
private String projectCode;
/**
*
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
*
*/
@ExcelProperty(value = "验收确认编号")
private String acceptanceCode;
/**
*
*/
@ExcelProperty(value = "项目经理")
private Long managerId;
/**
*
*/
@ExcelProperty(value = "项目经理姓名")
private String projectManagerName;
/**
*
*/
@ExcelProperty(value = "验收日期")
private Date acceptanceDate;
/**
*
*/
@ExcelProperty(value = "验收单附件")
private String ossId;
/**
*
*/
@ExcelProperty(value = "部门负责人")
private Long chargeId;
/**
*
*/
@ExcelProperty(value = "分管副总")
private Long deputyId;
/**
*
*/
@ExcelProperty(value = "部门负责人姓名")
private String chargeName;
/**
*
*/
@ExcelProperty(value = "分管副总姓名")
private String deputyName;
/**
*
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* (1 2 3)
*/
@ExcelProperty(value = "项目状态")
private String acceptanceStatus;
/**
*
*/
@ExcelProperty(value = "流程状态")
private String flowStatus;
}

@ -41,6 +41,12 @@ public class ErpProjectChangeVo implements Serializable {
@ExcelProperty(value = "项目变更ID")
private Long projectChangeId;
/**
*
*/
@ExcelProperty(value = "项目变更编号")
private String projectChangeCode;
/**
* ID
*/

@ -43,6 +43,12 @@ public class ErpProjectPlanVo implements Serializable {
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
*
*/
@ExcelProperty(value = "项目计划编号")
private String projectPlanCode;
/**
*
*/
@ -86,6 +92,12 @@ public class ErpProjectPlanVo implements Serializable {
@ExcelProperty(value = "合同ID(预留)")
private Long contractId;
/**
* ID
*/
@ExcelProperty(value = "附件ID")
private String ossId;
/**
*
*/
@ -116,6 +128,12 @@ public class ErpProjectPlanVo implements Serializable {
@ExcelProperty(value = "项目经理名称")
private String managerName;
/**
*
*/
@ExcelProperty(value = "项目经理部门名称")
private String managerDeptName;
/**
*
*/

@ -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,72 @@ 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;
/**
* ID
*/
@ExcelProperty(value = "部门ID")
private Long deptId;
/**
*
*/
@ExcelProperty(value = "提报人")
private Long reporterId;
/**
*
*/
@ExcelProperty(value = "提报人名称")
private String reporterName;
/**
*
*/

@ -0,0 +1,130 @@
package org.dromara.oa.erp.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.oa.erp.domain.ErpProjectReceiving;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* erp_project_receiving
*
* @author Yinq
* @date 2025-11-12
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ErpProjectReceiving.class)
public class ErpProjectReceivingVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "收货确认ID")
private Long receivingId;
/**
*
*/
@ExcelProperty(value = "项目号")
private String projectCode;
/**
*
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
* ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
*
*/
@ExcelProperty(value = "项目经理")
private Long managerId;
/**
*
*/
@ExcelProperty(value = "到货日期")
private Date arrivalDate;
/**
*
*/
@ExcelProperty(value = "收货单附件")
private String ossId;
/**
*
*/
@ExcelProperty(value = "项目经理姓名")
private String projectManagerName;
/**
*
*/
@ExcelProperty(value = "部门负责人")
private Long chargeId;
/**
*
*/
@ExcelProperty(value = "分管副总")
private Long deputyId;
/**
*
*/
@ExcelProperty(value = "部门负责人姓名")
private String chargeName;
/**
*
*/
@ExcelProperty(value = "分管副总姓名")
private String deputyName;
/**
*
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* (1 2 3)
*/
@ExcelProperty(value = "项目状态")
private String receivingStatus;
/**
*
*/
@ExcelProperty(value = "流程状态")
private String flowStatus;
/**
*
*/
@ExcelProperty(value = "收货确认编号")
private String receivingCode;
}

@ -0,0 +1,131 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import java.util.Collection;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.oa.erp.domain.ErpProjectAcceptance;
import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.annotation.DataColumn;
/**
* Mapper
*
* @author Yinq
* @date 2025-11-12
*/
public interface ErpProjectAcceptanceMapper extends BaseMapperPlus<ErpProjectAcceptance, ErpProjectAcceptanceVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
public Page<ErpProjectAcceptanceVo> selectCustomErpProjectAcceptanceVoList(@Param("page") Page<ErpProjectAcceptanceVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectAcceptance> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
public List<ErpProjectAcceptanceVo> selectCustomErpProjectAcceptanceVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectAcceptance> queryWrapper);
/**
* ID
*
* @param acceptanceId ID
* @return
*/
ErpProjectAcceptanceVo selectCustomErpProjectAcceptanceVoById(@Param("acceptanceId") Long acceptanceId);
/**
* ID
*
* @param ids ID
* @return
*/
List<ErpProjectAcceptanceVo> selectCustomErpProjectAcceptanceVoByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
Long countCustomErpProjectAcceptance(@Param(Constants.WRAPPER) Wrapper<ErpProjectAcceptance> queryWrapper);
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
Page<ErpProjectAcceptanceVo> selectCustomErpProjectAcceptanceVoPage(@Param("page") Page<ErpProjectAcceptanceVo> page, @Param(Constants.WRAPPER) Wrapper<ErpProjectAcceptance> queryWrapper);
/**
*
*
* @param list
* @return
*/
int batchInsertErpProjectAcceptance(@Param("list") List<ErpProjectAcceptance> list);
/**
*
*
* @param list
* @return
*/
int batchUpdateErpProjectAcceptance(@Param("list") List<ErpProjectAcceptance> list);
/**
*
*
* @param queryWrapper
* @return
*/
int deleteCustomErpProjectAcceptance(@Param(Constants.WRAPPER) Wrapper<ErpProjectAcceptance> queryWrapper);
/**
* ID
*
* @param ids ID
* @return
*/
int deleteCustomErpProjectAcceptanceByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Boolean existsErpProjectAcceptance(@Param(Constants.WRAPPER) Wrapper<ErpProjectAcceptance> queryWrapper);
}

@ -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);
}

@ -0,0 +1,131 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import java.util.Collection;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.oa.erp.domain.ErpProjectReceiving;
import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.annotation.DataColumn;
/**
* Mapper
*
* @author Yinq
* @date 2025-11-12
*/
public interface ErpProjectReceivingMapper extends BaseMapperPlus<ErpProjectReceiving, ErpProjectReceivingVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
public Page<ErpProjectReceivingVo> selectCustomErpProjectReceivingVoList(@Param("page") Page<ErpProjectReceivingVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectReceiving> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
public List<ErpProjectReceivingVo> selectCustomErpProjectReceivingVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpProjectReceiving> queryWrapper);
/**
* ID
*
* @param receivingId ID
* @return
*/
ErpProjectReceivingVo selectCustomErpProjectReceivingVoById(@Param("receivingId") Long receivingId);
/**
* ID
*
* @param ids ID
* @return
*/
List<ErpProjectReceivingVo> selectCustomErpProjectReceivingVoByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
Long countCustomErpProjectReceiving(@Param(Constants.WRAPPER) Wrapper<ErpProjectReceiving> queryWrapper);
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
@DataPermission({
@DataColumn(key = "deptName", value = "t.create_dept"),
@DataColumn(key = "userName", value = "t.create_by")
})
Page<ErpProjectReceivingVo> selectCustomErpProjectReceivingVoPage(@Param("page") Page<ErpProjectReceivingVo> page, @Param(Constants.WRAPPER) Wrapper<ErpProjectReceiving> queryWrapper);
/**
*
*
* @param list
* @return
*/
int batchInsertErpProjectReceiving(@Param("list") List<ErpProjectReceiving> list);
/**
*
*
* @param list
* @return
*/
int batchUpdateErpProjectReceiving(@Param("list") List<ErpProjectReceiving> list);
/**
*
*
* @param queryWrapper
* @return
*/
int deleteCustomErpProjectReceiving(@Param(Constants.WRAPPER) Wrapper<ErpProjectReceiving> queryWrapper);
/**
* ID
*
* @param ids ID
* @return
*/
int deleteCustomErpProjectReceivingByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Boolean existsErpProjectReceiving(@Param(Constants.WRAPPER) Wrapper<ErpProjectReceiving> queryWrapper);
}

@ -0,0 +1,85 @@
package org.dromara.oa.erp.service;
import org.dromara.oa.erp.domain.ErpProjectAcceptance;
import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo;
import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author Yinq
* @date 2025-11-12
*/
public interface IErpProjectAcceptanceService {
/**
*
*
* @param acceptanceId
* @return
*/
ErpProjectAcceptanceVo queryById(Long acceptanceId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<ErpProjectAcceptanceVo> queryPageList(ErpProjectAcceptanceBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<ErpProjectAcceptanceVo> queryList(ErpProjectAcceptanceBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(ErpProjectAcceptanceBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(ErpProjectAcceptanceBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ID
*
* @param projectId ID
* @return
*/
ErpProjectAcceptanceVo prepareByProjectId(Long projectId);
/**
*
*
* @param bo
* @return
*/
ErpProjectAcceptanceVo submitAndFlowStart(ErpProjectAcceptanceBo bo);
}

@ -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);
}

@ -0,0 +1,85 @@
package org.dromara.oa.erp.service;
import org.dromara.oa.erp.domain.ErpProjectReceiving;
import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo;
import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* Service
*
* @author Yinq
* @date 2025-11-12
*/
public interface IErpProjectReceivingService {
/**
*
*
* @param receivingId
* @return
*/
ErpProjectReceivingVo queryById(Long receivingId);
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
TableDataInfo<ErpProjectReceivingVo> queryPageList(ErpProjectReceivingBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<ErpProjectReceivingVo> queryList(ErpProjectReceivingBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean insertByBo(ErpProjectReceivingBo bo);
/**
*
*
* @param bo
* @return
*/
Boolean updateByBo(ErpProjectReceivingBo bo);
/**
*
*
* @param ids
* @param isValid
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ID
*
* @param projectId ID
* @return
*/
ErpProjectReceivingVo prepareByProjectId(Long projectId);
/**
*
*
* @param bo
* @return
*/
ErpProjectReceivingVo submitAndFlowStart(ErpProjectReceivingBo bo);
}

@ -103,6 +103,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
.selectAll(ErpContractInfo.class)
.eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpContractInfo::getContractFlag, bo.getContractFlag())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractInfo::getContractCode, bo.getContractCode())
.eq(StringUtils.isNotBlank(bo.getCustomerContractCode()), ErpContractInfo::getCustomerContractCode, bo.getCustomerContractCode())
.like(StringUtils.isNotBlank(bo.getContractName()), ErpContractInfo::getContractName, bo.getContractName())
.eq(StringUtils.isNotBlank(bo.getContractCategory()), ErpContractInfo::getContractCategory, bo.getContractCategory())
.eq(StringUtils.isNotBlank(bo.getContractType()), ErpContractInfo::getContractType, bo.getContractType())
@ -250,10 +251,16 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
contractInfo.setContractStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
contractInfo.setContractStatus(OAStatusEnum.COMPLETED.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())){
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
contractInfo.setContractStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
contractInfo.setContractStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(contractInfo);
});

@ -0,0 +1,370 @@
package org.dromara.oa.erp.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.OAStatusEnum;
import org.dromara.common.core.exception.ServiceException;
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.oa.erp.domain.ErpProjectAcceptance;
import org.dromara.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.domain.bo.ErpProjectAcceptanceBo;
import org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.mapper.ErpProjectAcceptanceMapper;
import org.dromara.oa.erp.mapper.ErpProjectInfoMapper;
import org.dromara.oa.erp.service.IErpProjectAcceptanceService;
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 java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* Service
*
* @author Yinq
* @date 2025-11-12
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class ErpProjectAcceptanceServiceImpl implements IErpProjectAcceptanceService {
private static final String ACCEPTANCE_CODE_RULE = "1008";
private final ErpProjectAcceptanceMapper baseMapper;
private final ErpProjectInfoMapper projectInfoMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
*
* @param acceptanceId
* @return
*/
@Override
public ErpProjectAcceptanceVo queryById(Long acceptanceId){
return baseMapper.selectCustomErpProjectAcceptanceVoById(acceptanceId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpProjectAcceptanceVo> queryPageList(ErpProjectAcceptanceBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpProjectAcceptance> lqw = buildQueryWrapper(bo);
Page<ErpProjectAcceptanceVo> result = baseMapper.selectCustomErpProjectAcceptanceVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ErpProjectAcceptanceVo> queryList(ErpProjectAcceptanceBo bo) {
MPJLambdaWrapper<ErpProjectAcceptance> lqw = buildQueryWrapper(bo);
return baseMapper.selectCustomErpProjectAcceptanceVoList(lqw);
}
private MPJLambdaWrapper<ErpProjectAcceptance> buildQueryWrapper(ErpProjectAcceptanceBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpProjectAcceptance> lqw = JoinWrappers.lambda(ErpProjectAcceptance.class)
.selectAll(ErpProjectAcceptance.class)
.eq(ErpProjectAcceptance::getDelFlag, "0")
.eq(bo.getProjectId() != null, ErpProjectAcceptance::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectAcceptance::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectAcceptance::getProjectName, bo.getProjectName())
.eq(bo.getManagerId() != null, ErpProjectAcceptance::getManagerId, bo.getManagerId())
.eq(bo.getAcceptanceDate() != null, ErpProjectAcceptance::getAcceptanceDate, bo.getAcceptanceDate())
.eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectAcceptance::getOssId, bo.getOssId())
.eq(bo.getChargeId() != null, ErpProjectAcceptance::getChargeId, bo.getChargeId())
.eq(bo.getDeputyId() != null, ErpProjectAcceptance::getDeputyId, bo.getDeputyId());
if (params != null) {
String beginTime = Convert.toStr(params.get("beginTime"));
String endTime = Convert.toStr(params.get("endTime"));
lqw.ge(StringUtils.isNotBlank(beginTime), ErpProjectAcceptance::getAcceptanceDate, beginTime)
.le(StringUtils.isNotBlank(endTime), ErpProjectAcceptance::getAcceptanceDate, endTime);
}
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(ErpProjectAcceptanceBo bo) {
// 权限校验:只有项目经理才能提交
validateProjectManager(bo.getManagerId());
ErpProjectAcceptance add = MapstructUtils.convert(bo, ErpProjectAcceptance.class);
fillAcceptanceCode(add);
validEntityBeforeSave(add);
// 默认业务状态:暂存
if (StringUtils.isBlank(add.getAcceptanceStatus())) {
add.setAcceptanceStatus(OAStatusEnum.DRAFT.getStatus());
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setAcceptanceId(add.getAcceptanceId());
bo.setAcceptanceCode(add.getAcceptanceCode());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(ErpProjectAcceptanceBo bo) {
// 权限校验:只有项目经理才能修改
ErpProjectAcceptance existing = baseMapper.selectById(bo.getAcceptanceId());
if (existing == null) {
throw new ServiceException("项目验收确认不存在");
}
validateProjectManager(existing.getManagerId());
ErpProjectAcceptance update = MapstructUtils.convert(bo, ErpProjectAcceptance.class);
if (StringUtils.isBlank(update.getAcceptanceCode())) {
update.setAcceptanceCode(existing.getAcceptanceCode());
}
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ErpProjectAcceptance entity){
//TODO 做一些数据校验,如唯一约束
}
/**
*
*/
private void fillAcceptanceCode(ErpProjectAcceptance entity) {
if (StringUtils.isNotBlank(entity.getAcceptanceCode())) {
return;
}
String code = remoteCodeRuleService.selectCodeRuleCode(ACCEPTANCE_CODE_RULE);
if (StringUtils.isBlank(code)) {
throw new ServiceException("生成验收确认编号失败");
}
entity.setAcceptanceCode(code);
}
/**
* /
*
* @param managerId ID
*/
private void validateProjectManager(Long managerId) {
// 超级管理员跳过校验
if (LoginHelper.isSuperAdmin()) {
return;
}
// 普通用户判断当前用户ID是否等于项目经理ID
Long currentUserId = LoginHelper.getUserId();
if (!Objects.equals(currentUserId, managerId)) {
throw new ServiceException("只有项目经理才能提交或修改项目验收确认");
}
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* ID
*
* @param projectId ID
* @return
*/
@Override
public ErpProjectAcceptanceVo prepareByProjectId(Long projectId) {
if (projectId == null) {
throw new ServiceException("项目ID不能为空");
}
// 查询项目信息
ErpProjectInfoVo projectInfo = projectInfoMapper.selectVoById(projectId);
if (projectInfo == null) {
throw new ServiceException("项目信息不存在");
}
// 构造验收信息
ErpProjectAcceptanceVo vo = new ErpProjectAcceptanceVo();
vo.setProjectId(projectId);
vo.setProjectCode(projectInfo.getProjectCode());
vo.setProjectName(projectInfo.getProjectName());
vo.setManagerId(projectInfo.getManagerId());
vo.setProjectManagerName(projectInfo.getManagerName());
vo.setChargeId(projectInfo.getChargeId());
vo.setChargeName(projectInfo.getChargeName());
vo.setDeputyId(projectInfo.getDeputyId());
vo.setDeputyName(projectInfo.getDeputyName());
return vo;
}
/**
*
*
* @param bo
* @return
*/
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public ErpProjectAcceptanceVo submitAndFlowStart(ErpProjectAcceptanceBo bo) {
// 权限校验:只有项目经理才能提交
validateProjectManager(bo.getManagerId());
ErpProjectAcceptance add = MapstructUtils.convert(bo, ErpProjectAcceptance.class);
validEntityBeforeSave(add);
// 保存或更新
if (StringUtils.isNull(bo.getAcceptanceId())) {
this.insertByBo(bo);
} else {
this.updateByBo(bo);
}
// 发起流程(空值保护)
if (bo.getVariables() == null) {
bo.setVariables(new java.util.HashMap<>());
}
bo.getVariables().put("ignore", true);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(bo.getAcceptanceId().toString());
startProcess.setFlowCode(bo.getFlowCode());
startProcess.setVariables(bo.getVariables());
if (bo.getBizExt() == null) {
bo.setBizExt(new RemoteFlowInstanceBizExt());
}
if (StringUtils.isNotEmpty(bo.getAcceptanceCode())) {
bo.getBizExt().setBusinessCode(bo.getAcceptanceCode());
}
startProcess.setBizExt(bo.getBizExt());
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess);
if (!flagOne) {
throw new ServiceException("流程发起异常");
}
return MapstructUtils.convert(add, ErpProjectAcceptanceVo.class);
}
/**
* (: 稿退)
*
* @param processEvent
*/
@EventListener(condition = "#processEvent.flowCode =='OAPA'")
public void processHandler(ProcessEvent processEvent) {
TenantHelper.dynamic(processEvent.getTenantId(), () -> {
log.info("项目验收流程执行:{}", processEvent.toString());
ErpProjectAcceptance acceptance = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId()));
if (acceptance != null) {
// 更新流程状态
acceptance.setFlowStatus(processEvent.getStatus());
Map<String, Object> params = processEvent.getParams();
if (MapUtil.isNotEmpty(params)) {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
// 根据流程状态更新业务状态
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
acceptance.setAcceptanceStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
acceptance.setAcceptanceStatus(OAStatusEnum.COMPLETED.getStatus());
// 审批完成后,更新项目信息的项目状态为 7已验收
Long projectId = acceptance.getProjectId();
if (projectId != null) {
ErpProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
if (projectInfo != null) {
String currentStatus = projectInfo.getProjectStatus();
boolean needUpdate = false;
if (StringUtils.isBlank(currentStatus)) {
needUpdate = true;
} else {
try {
/** 7 1 3 5 "7"
退 8 7 */
needUpdate = Integer.parseInt(currentStatus) < 7;
} catch (NumberFormatException e) {
// 非数字状态直接覆盖为已验收
needUpdate = true;
}
}
if (needUpdate) {
projectInfo.setProjectStatus("7"); // 7已验收
projectInfoMapper.updateById(projectInfo);
}
}
}
log.info("项目验收确认完成: acceptanceId={}", acceptance.getAcceptanceId());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
acceptance.setAcceptanceStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
// 流程驳回:业务状态还原为草稿,允许重新编辑和提交
acceptance.setAcceptanceStatus(OAStatusEnum.DRAFT.getStatus());//暂存
}
baseMapper.updateById(acceptance);
}
});
}
}

@ -2,6 +2,12 @@ package org.dromara.oa.erp.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
@ -13,32 +19,25 @@ import org.dromara.common.core.utils.ObjectUtils;
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.oa.erp.domain.*;
import org.dromara.oa.erp.domain.bo.ErpProjectChangeBo;
import org.dromara.oa.erp.domain.vo.ErpProjectChangeVo;
import org.dromara.oa.erp.mapper.*;
import org.dromara.oa.erp.service.IErpProjectChangeService;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
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 org.dromara.common.satoken.utils.LoginHelper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZoneId;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.github.yulichang.toolkit.JoinWrappers;
import java.math.BigDecimal;
import java.util.*;
/**
* Service
@ -51,6 +50,8 @@ import java.math.BigDecimal;
@Slf4j
public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
private static final String PROJECT_CHANGE_CODE_RULE = "1011";
// 计划变更主子表
private final ErpProjectChangeMapper baseMapper;
private final ErpProjectChangeBudgetMapper changeBudgetMapper;
@ -66,6 +67,8 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
@ -152,6 +155,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
.selectAll(ErpProjectChange.class)
.eq(ErpProjectChange::getDelFlag, "0")
.eq(bo.getProjectId() != null, ErpProjectChange::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getProjectChangeCode()), ErpProjectChange::getProjectChangeCode, bo.getProjectChangeCode())
.eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectChange::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectChange::getProjectName, bo.getProjectName())
.eq(StringUtils.isNotBlank(bo.getProjectCategory()), ErpProjectChange::getProjectCategory, bo.getProjectCategory())
@ -202,6 +206,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
*/
ErpProjectChange add = MapstructUtils.convert(bo, ErpProjectChange.class);
fillProjectChangeCode(add);
validEntityBeforeSave(add);
// 设置默认状态
@ -215,6 +220,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setProjectChangeId(add.getProjectChangeId());
bo.setProjectChangeCode(add.getProjectChangeCode());
// 保存预算变更明细
if (bo.getBudgetList() != null && !bo.getBudgetList().isEmpty()) {
@ -260,6 +266,9 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
}
ErpProjectChange update = MapstructUtils.convert(bo, ErpProjectChange.class);
if (StringUtils.isBlank(update.getProjectChangeCode())) {
update.setProjectChangeCode(existing.getProjectChangeCode());
}
validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0;
@ -305,12 +314,17 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
if (projectId == null) {
throw new ServiceException("项目ID不能为空");
}
// 查询项目信息
ErpProjectChangeVo vo = baseMapper.prepareByProjectId(projectId);
if (vo == null) {
throw new ServiceException("项目信息不存在");
}
// 检查是否有未完成的变更状态1或2
List<ErpProjectChange> existingChanges = baseMapper.selectList(
Wrappers.<ErpProjectChange>lambdaQuery()
.eq(ErpProjectChange::getProjectId, projectId)
.in(ErpProjectChange::getProjectChangeStatus, Arrays.asList("1", "2"))
.in(ErpProjectChange::getProjectChangeStatus, Arrays.asList("1", "2"))//项目变更状态(1暂存 2审批中 3可用)
.orderByDesc(ErpProjectChange::getCreateTime)
);
@ -325,17 +339,12 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
throw new ServiceException("该项目存在未完成的变更申请,请先完成或取消后再发起新的变更");
}
// 查询项目信息
ErpProjectChangeVo vo = baseMapper.prepareByProjectId(projectId);
if (vo == null) {
throw new ServiceException("项目信息不存在");
}
// 计算变更次数(已完成的变更数量)
Long changeCount = baseMapper.selectCount(
Wrappers.<ErpProjectChange>lambdaQuery()
.eq(ErpProjectChange::getProjectId, projectId)
.eq(ErpProjectChange::getProjectChangeStatus, "3")
.eq(ErpProjectChange::getProjectChangeStatus, "3")//项目变更状态(1暂存 2审批中 3可用)
);
vo.setChangeNumber(changeCount.intValue() + 1);
@ -344,8 +353,8 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
ErpProjectChange lastChange = baseMapper.selectOne(
Wrappers.<ErpProjectChange>lambdaQuery()
.eq(ErpProjectChange::getProjectId, projectId)
.eq(ErpProjectChange::getProjectChangeStatus, "3")
.orderByDesc(ErpProjectChange::getCreateTime)
.eq(ErpProjectChange::getProjectChangeStatus, "3")// 项目变更状态(1暂存 2审批中 3可用)
.orderByDesc(ErpProjectChange::getChangeNumber)// 按变更次数降序
.last("limit 1")
);
@ -376,12 +385,8 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
}
vo.setBudgetList(budgetList);
// 查询上一次变更的进度变更明细作为参考
List<ErpProjectChangeProgress> lastProgressList = changeProgressMapper.selectList(
Wrappers.<ErpProjectChangeProgress>lambdaQuery()
.eq(ErpProjectChangeProgress::getProjectChangeId, lastChange.getProjectChangeId())
.orderByAsc(ErpProjectChangeProgress::getSortOrder)
);
// 查询上一次变更的进度变更明细作为参考(连表查询项目计划阶段,带出 projectPhases 字段)
List<ErpProjectChangeProgress> lastProgressList = changeProgressMapper.selectProgressWithStageInfo(lastChange.getProjectChangeId());
List<ErpProjectChangeProgress> progressList = new ArrayList<>();
// 将上一次的变更后时间作为本次的原计划时间
@ -453,8 +458,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
ErpProjectChangeBudget budget = new ErpProjectChangeBudget();
budget.setBudgetDetailId(detail.getBudgetDetailId());
budget.setSubjectName(detail.getBudgetItem());
//xins的预算表数据库是decimal实体类ErpBudgetDetail却是Long所以这里需要转换一下
BigDecimal budgetCost = BigDecimal.valueOf(detail.getBudgetCost());
BigDecimal budgetCost = detail.getBudgetCost();
budget.setBudgetBefore(budgetCost);
budget.setBudgetAfter(budgetCost); // 默认值
budget.setAmountUsed(BigDecimal.ZERO); // 默认已使用金额为0
@ -467,7 +471,7 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
// 设置默认状态
vo.setProjectChangeStatus("1"); // 暂存
vo.setActiveFlag("1");
vo.setActiveFlag("1");//默认激活
return vo;
}
@ -570,6 +574,20 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
//TODO 做一些数据校验,如唯一约束
}
/**
*
*/
private void fillProjectChangeCode(ErpProjectChange entity) {
if (StringUtils.isNotBlank(entity.getProjectChangeCode())) {
return;
}
String code = remoteCodeRuleService.selectCodeRuleCode(PROJECT_CHANGE_CODE_RULE);
if (StringUtils.isBlank(code)) {
throw new ServiceException("生成项目变更编号失败");
}
entity.setProjectChangeCode(code);
}
/**
*
* ErpProjectChange project_id project_plan_id
@ -640,8 +658,19 @@ public class ErpProjectChangeServiceImpl implements IErpProjectChangeService {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())){
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
projectChange.setProjectChangeStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())){
// 流程完成:业务状态置为可用
projectChange.setProjectChangeStatus(OAStatusEnum.COMPLETED.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
// 流程作废:业务状态置为作废
projectChange.setProjectChangeStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
// 流程驳回:业务状态还原为草稿,允许重新编辑和提交
projectChange.setProjectChangeStatus(OAStatusEnum.DRAFT.getStatus());//暂存
}
baseMapper.updateById(projectChange);
});

@ -90,7 +90,7 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
MPJLambdaWrapper<ErpProjectInfo> lqw = JoinWrappers.lambda(ErpProjectInfo.class)
.selectAll(ErpProjectInfo.class)
.eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpProjectInfo::getContractFlag, bo.getContractFlag())
.eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectInfo::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectInfo::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectInfo::getProjectName, bo.getProjectName())
.eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpProjectInfo::getBusinessDirection, bo.getBusinessDirection())
.eq(StringUtils.isNotBlank(bo.getProjectCategory()), ErpProjectInfo::getProjectCategory, bo.getProjectCategory())
@ -212,10 +212,16 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
projectInfo.setProjectStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
projectInfo.setProjectStatus(OAStatusEnum.COMPLETED.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())) {
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
projectInfo.setProjectStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
projectInfo.setProjectStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(projectInfo);
});

@ -2,6 +2,11 @@ package org.dromara.oa.erp.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
@ -11,29 +16,25 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
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.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.domain.ErpProjectPlan;
import org.dromara.oa.erp.domain.ErpProjectPlanStage;
import org.dromara.oa.erp.domain.bo.ErpProjectPlanBo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanStageVo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo;
import org.dromara.oa.erp.mapper.ErpProjectPlanMapper;
import org.dromara.oa.erp.mapper.ErpProjectPlanStageMapper;
import org.dromara.oa.erp.service.IErpProjectPlanService;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
import org.springframework.context.event.EventListener;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpProjectPlanBo;
import org.dromara.oa.erp.domain.vo.ErpProjectPlanVo;
import org.dromara.oa.erp.domain.ErpProjectPlan;
import org.dromara.oa.erp.mapper.ErpProjectPlanMapper;
import org.dromara.oa.erp.service.IErpProjectPlanService;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@ -50,12 +51,16 @@ import java.util.stream.Collectors;
@Slf4j
public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
private static final String PROJECT_PLAN_CODE_RULE = "1010";
private final ErpProjectPlanMapper baseMapper;
private final ErpProjectPlanStageMapper planStageMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
@ -117,6 +122,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
.select(ErpProjectInfo::getProjectName)
.leftJoin(ErpProjectInfo.class,ErpProjectInfo::getProjectId, ErpProjectPlan::getProjectId)
.eq(bo.getProjectId() != null, ErpProjectPlan::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getProjectPlanCode()), ErpProjectPlan::getProjectPlanCode, bo.getProjectPlanCode())
.eq(bo.getManagerId() != null, ErpProjectPlan::getManagerId, bo.getManagerId())
.eq(bo.getChargeId() != null, ErpProjectPlan::getChargeId, bo.getChargeId())
.eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ErpProjectPlan::getPaymentMethod, bo.getPaymentMethod())
@ -124,6 +130,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpProjectPlan::getFlowStatus, bo.getFlowStatus())
.eq(bo.getSortOrder() != null, ErpProjectPlan::getSortOrder, bo.getSortOrder())
.eq(bo.getContractId() != null, ErpProjectPlan::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectPlan::getOssId, bo.getOssId())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpProjectPlan::getActiveFlag, bo.getActiveFlag());
return lqw;
}
@ -138,6 +145,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ErpProjectPlanBo bo) {
ErpProjectPlan add = MapstructUtils.convert(bo, ErpProjectPlan.class);
fillProjectPlanCode(add);
validEntityBeforeSave(add);
// 权限校验:只有项目经理才能提交
validateProjectManager(bo.getManagerId());
@ -145,6 +153,7 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setProjectPlanId(add.getProjectPlanId());
bo.setProjectPlanCode(add.getProjectPlanCode());
if ( ObjectUtils.isNotEmpty(planStageList)) {
for (ErpProjectPlanStage planStage : planStageList) {
planStage.setProjectPlanId(add.getProjectPlanId());
@ -181,12 +190,14 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
if (planStageList != null && !planStageList.isEmpty()) {
for (ErpProjectPlanStage newStage : planStageList) {
if (newStage.getPlanStageId() != null) {
// 只更新delayDay、scheduleRemark和receivableDate
// 只更新delayDay、scheduleRemark、receivableDate、realStartTime、realEndTime字段
ErpProjectPlanStage existingStage = planStageMapper.selectById(newStage.getPlanStageId());
if (existingStage != null) {
existingStage.setDelayDay(newStage.getDelayDay());
existingStage.setScheduleRemark(newStage.getScheduleRemark());
existingStage.setReceivableDate(newStage.getReceivableDate());
existingStage.setRealStartTime(newStage.getRealStartTime());// 实际开始时间
existingStage.setRealEndTime(newStage.getRealEndTime());//实际结束时间
planStageMapper.updateById(existingStage);
}
}
@ -198,6 +209,9 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
// 草稿状态,允许全面更新
ErpProjectPlan update = MapstructUtils.convert(bo, ErpProjectPlan.class);
if (StringUtils.isBlank(update.getProjectPlanCode())) {
update.setProjectPlanCode(existingPlan.getProjectPlanCode());
}
validEntityBeforeSave(update);
List<ErpProjectPlanStage> planStageList = bo.getPlanStageList();
MPJLambdaWrapper<ErpProjectPlanStage> lqwRecord = JoinWrappers.lambda(ErpProjectPlanStage.class);
@ -253,6 +267,20 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
}
}
/**
*
*/
private void fillProjectPlanCode(ErpProjectPlan entity) {
if (StringUtils.isNotBlank(entity.getProjectPlanCode())) {
return;
}
String code = remoteCodeRuleService.selectCodeRuleCode(PROJECT_PLAN_CODE_RULE);
if (StringUtils.isBlank(code)) {
throw new ServiceException("生成项目计划编号失败");
}
entity.setProjectPlanCode(code);
}
/**
*
*
@ -341,8 +369,17 @@ public class ErpProjectPlanServiceImpl implements IErpProjectPlanService {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
projectPlan.setProjectPlanStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
projectPlan.setProjectPlanStatus(OAStatusEnum.COMPLETED.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
projectPlan.setProjectPlanStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
// 流程驳回:业务状态还原为草稿,允许重新编辑和提交
projectPlan.setProjectPlanStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(projectPlan);
});

@ -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;
}
@ -136,25 +155,15 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public ErpProjectPurchaseVo projectPurchaseSubmitAndFlowStart(ErpProjectPurchaseBo bo) {
ErpProjectPurchase entity = MapstructUtils.convert(bo, ErpProjectPurchase.class);
validEntityBeforeSave(entity);
ErpProjectPurchase add = MapstructUtils.convert(bo, ErpProjectPurchase.class);
validEntityBeforeSave(add);
if (bo.getProjectPurchaseId() == null) {
this.insertByBo(bo);
} else {
this.updateByBo(bo);
}
if (bo.getVariables() == null) {
bo.setVariables(new HashMap<>());
}
bo.getVariables().put("ignore", true);
if (StringUtils.isBlank(bo.getFlowCode())) {
throw new ServiceException("流程编码不能为空");
}
RemoteFlowInstanceBizExt bizExt = bo.getBizExt();
if (bizExt == null) {
bizExt = new RemoteFlowInstanceBizExt();
bo.setBizExt(bizExt);
}
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(String.valueOf(bo.getProjectPurchaseId()));
startProcess.setFlowCode(bo.getFlowCode());
@ -165,13 +174,7 @@ public class ErpProjectPurchaseServiceImpl implements IErpProjectPurchaseService
if (!started) {
throw new ServiceException("流程发起异常");
}
// 更新状态为审批中
ErpProjectPurchase updateStatus = new ErpProjectPurchase();
updateStatus.setProjectPurchaseId(bo.getProjectPurchaseId());
updateStatus.setFlowStatus(BusinessStatusEnum.WAITING.getStatus());
updateStatus.setProjectPurchaseStatus("2");
baseMapper.updateById(updateStatus);
return queryById(bo.getProjectPurchaseId());
return MapstructUtils.convert(add, ErpProjectPurchaseVo.class);
}
/**
@ -181,10 +184,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 +241,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 +280,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);

@ -0,0 +1,365 @@
package org.dromara.oa.erp.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.OAStatusEnum;
import org.dromara.common.core.exception.ServiceException;
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.oa.erp.domain.ErpProjectInfo;
import org.dromara.oa.erp.domain.ErpProjectReceiving;
import org.dromara.oa.erp.domain.bo.ErpProjectReceivingBo;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo;
import org.dromara.oa.erp.mapper.ErpProjectInfoMapper;
import org.dromara.oa.erp.mapper.ErpProjectReceivingMapper;
import org.dromara.oa.erp.service.IErpProjectReceivingService;
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 java.util.*;
/**
* Service
*
* @author Yinq
* @date 2025-11-12
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class ErpProjectReceivingServiceImpl implements IErpProjectReceivingService {
private static final String RECEIVING_CODE_RULE = "1009";
private final ErpProjectReceivingMapper baseMapper;
private final ErpProjectInfoMapper projectInfoMapper;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteCodeRuleService remoteCodeRuleService;
/**
*
*
* @param receivingId
* @return
*/
@Override
public ErpProjectReceivingVo queryById(Long receivingId){
return baseMapper.selectCustomErpProjectReceivingVoById(receivingId);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpProjectReceivingVo> queryPageList(ErpProjectReceivingBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpProjectReceiving> lqw = buildQueryWrapper(bo);
Page<ErpProjectReceivingVo> result = baseMapper.selectCustomErpProjectReceivingVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<ErpProjectReceivingVo> queryList(ErpProjectReceivingBo bo) {
MPJLambdaWrapper<ErpProjectReceiving> lqw = buildQueryWrapper(bo);
return baseMapper.selectCustomErpProjectReceivingVoList(lqw);
}
private MPJLambdaWrapper<ErpProjectReceiving> buildQueryWrapper(ErpProjectReceivingBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpProjectReceiving> lqw = JoinWrappers.lambda(ErpProjectReceiving.class)
.selectAll(ErpProjectReceiving.class)
.eq(ErpProjectReceiving::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectReceiving::getProjectCode, bo.getProjectCode())
.like(StringUtils.isNotBlank(bo.getProjectName()), ErpProjectReceiving::getProjectName, bo.getProjectName())
.eq(bo.getManagerId() != null, ErpProjectReceiving::getManagerId, bo.getManagerId())
.eq(bo.getArrivalDate() != null, ErpProjectReceiving::getArrivalDate, bo.getArrivalDate())
.eq(StringUtils.isNotBlank(bo.getOssId()), ErpProjectReceiving::getOssId, bo.getOssId())
.eq(bo.getChargeId() != null, ErpProjectReceiving::getChargeId, bo.getChargeId())
.eq(bo.getDeputyId() != null, ErpProjectReceiving::getDeputyId, bo.getDeputyId());
if (params != null) {
String beginTime = Convert.toStr(params.get("beginTime"));
String endTime = Convert.toStr(params.get("endTime"));
lqw.ge(StringUtils.isNotBlank(beginTime), ErpProjectReceiving::getArrivalDate, beginTime)
.le(StringUtils.isNotBlank(endTime), ErpProjectReceiving::getArrivalDate, endTime);
}
return lqw;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean insertByBo(ErpProjectReceivingBo bo) {
// 权限校验:只有项目经理才能提交
validateProjectManager(bo.getManagerId());
ErpProjectReceiving add = MapstructUtils.convert(bo, ErpProjectReceiving.class);
fillReceivingCode(add);
validEntityBeforeSave(add);
// 默认业务状态:暂存
if (StringUtils.isBlank(add.getReceivingStatus())) {
add.setReceivingStatus(OAStatusEnum.DRAFT.getStatus());
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setReceivingId(add.getReceivingId());
bo.setReceivingCode(add.getReceivingCode());
}
return flag;
}
/**
*
*
* @param bo
* @return
*/
@Override
public Boolean updateByBo(ErpProjectReceivingBo bo) {
// 权限校验:只有项目经理才能修改
ErpProjectReceiving existing = baseMapper.selectById(bo.getReceivingId());
if (existing == null) {
throw new ServiceException("项目收货确认不存在");
}
validateProjectManager(existing.getManagerId());
ErpProjectReceiving update = MapstructUtils.convert(bo, ErpProjectReceiving.class);
if (StringUtils.isBlank(update.getReceivingCode())) {
update.setReceivingCode(existing.getReceivingCode());
}
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(ErpProjectReceiving entity){
//TODO 做一些数据校验,如唯一约束
}
/**
*
*/
private void fillReceivingCode(ErpProjectReceiving entity) {
if (StringUtils.isNotBlank(entity.getReceivingCode())) {
return;
}
String code = remoteCodeRuleService.selectCodeRuleCode(RECEIVING_CODE_RULE);
if (StringUtils.isBlank(code)) {
throw new ServiceException("生成收货确认编号失败");
}
entity.setReceivingCode(code);
}
/**
* /
*
* @param managerId ID
*/
private void validateProjectManager(Long managerId) {
// 超级管理员跳过校验
if (LoginHelper.isSuperAdmin()) {
return;
}
// 普通用户判断当前用户ID是否等于项目经理ID
Long currentUserId = LoginHelper.getUserId();
if (!Objects.equals(currentUserId, managerId)) {
throw new ServiceException("只有项目经理才能提交或修改项目收货确认");
}
}
/**
*
*
* @param ids
* @param isValid
* @return
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* ID
*
* @param projectId ID
* @return
*/
@Override
public ErpProjectReceivingVo prepareByProjectId(Long projectId) {
if (projectId == null) {
throw new ServiceException("项目ID不能为空");
}
// 查询项目信息
ErpProjectInfoVo projectInfo = projectInfoMapper.selectVoById(projectId);
if (projectInfo == null) {
throw new ServiceException("项目信息不存在");
}
// 构造收货信息
ErpProjectReceivingVo vo = new ErpProjectReceivingVo();
vo.setProjectId(projectInfo.getProjectId());
vo.setProjectCode(projectInfo.getProjectCode());
vo.setProjectName(projectInfo.getProjectName());
vo.setManagerId(projectInfo.getManagerId());
vo.setProjectManagerName(projectInfo.getManagerName());
vo.setChargeId(projectInfo.getChargeId());
vo.setChargeName(projectInfo.getChargeName());
vo.setDeputyId(projectInfo.getDeputyId());
vo.setDeputyName(projectInfo.getDeputyName());
return vo;
}
/**
*
*
* @param bo
* @return
*/
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public ErpProjectReceivingVo submitAndFlowStart(ErpProjectReceivingBo bo) {
// 权限校验:只有项目经理才能提交
validateProjectManager(bo.getManagerId());
ErpProjectReceiving add = MapstructUtils.convert(bo, ErpProjectReceiving.class);
validEntityBeforeSave(add);
// 保存或更新
if (StringUtils.isNull(bo.getReceivingId())) {
this.insertByBo(bo);
} else {
this.updateByBo(bo);
}
// 发起流程(空值保护)
if (bo.getVariables() == null) {
bo.setVariables(new HashMap<>());
}
bo.getVariables().put("ignore", true);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(bo.getReceivingId().toString());
startProcess.setFlowCode(bo.getFlowCode());
startProcess.setVariables(bo.getVariables());
if (bo.getBizExt() == null) {
bo.setBizExt(new RemoteFlowInstanceBizExt());
}
if (StringUtils.isNotEmpty(bo.getReceivingCode())) {
bo.getBizExt().setBusinessCode(bo.getReceivingCode());
}
startProcess.setBizExt(bo.getBizExt());
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess);
if (!flagOne) {
throw new ServiceException("流程发起异常");
}
return MapstructUtils.convert(add, ErpProjectReceivingVo.class);
}
/**
* (: 稿退)
*
* @param processEvent
*/
@EventListener(condition = "#processEvent.flowCode =='OAPR'")
public void processHandler(ProcessEvent processEvent) {
TenantHelper.dynamic(processEvent.getTenantId(), () -> {
log.info("项目收货流程执行:{}", processEvent.toString());
ErpProjectReceiving receiving = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId()));
if (receiving != null) {
// 更新流程状态
receiving.setFlowStatus(processEvent.getStatus());
Map<String, Object> params = processEvent.getParams();
if (MapUtil.isNotEmpty(params)) {
// 办理人
String handler = Convert.toStr(params.get("handler"));
}
// 根据流程状态更新业务状态
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
receiving.setReceivingStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
receiving.setReceivingStatus(OAStatusEnum.COMPLETED.getStatus());
// 审批完成后,更新项目信息的项目状态为 5已收货
Long projectId = receiving.getProjectId();
if (projectId != null) {
ErpProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
if (projectInfo != null) {
String currentStatus = projectInfo.getProjectStatus();
boolean needUpdate = false;
if (StringUtils.isBlank(currentStatus)) {
needUpdate = true;
} else {
try {
/** 5 1 3 "5"
退 8 5 */
needUpdate = Integer.parseInt(currentStatus) < 5;
} catch (NumberFormatException e) {
// 非数字状态直接覆盖为已收货
needUpdate = true;
}
}
if (needUpdate) {
projectInfo.setProjectStatus("5"); // 5已收货
projectInfoMapper.updateById(projectInfo);
}
}
}
log.info("项目收货确认完成: receivingId={}", receiving.getReceivingId());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
receiving.setReceivingStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
// 流程驳回:业务状态还原为草稿,允许重新编辑和提交
receiving.setReceivingStatus(OAStatusEnum.DRAFT.getStatus());//暂存
}
baseMapper.updateById(receiving);
}
});
}
}

@ -11,6 +11,7 @@
t.tenant_id,
t.contract_flag,
t.contract_code,
t.customer_contract_code,
t.contract_name,
t.contract_category,
t.contract_type,

@ -0,0 +1,243 @@
<?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">
<mapper namespace="org.dromara.oa.erp.mapper.ErpProjectAcceptanceMapper">
<resultMap type="org.dromara.oa.erp.domain.vo.ErpProjectAcceptanceVo" id="ErpProjectAcceptanceResult">
<id property="acceptanceId" column="acceptance_id"/>
<result property="projectId" column="project_id"/>
<result property="projectCode" column="project_code"/>
<result property="projectName" column="project_name"/>
<result property="managerId" column="manager_id"/>
<result property="projectManagerName" column="projectManagerName"/>
<result property="acceptanceDate" column="acceptance_date"/>
<result property="ossId" column="oss_id"/>
<result property="acceptanceCode" column="acceptance_code"/>
<result property="chargeId" column="charge_id"/>
<result property="chargeName" column="chargeName"/>
<result property="deputyId" column="deputy_id"/>
<result property="deputyName" column="deputyName"/>
<result property="remark" column="remark"/>
<result property="acceptanceStatus" column="acceptance_status"/>
<result property="flowStatus" column="flow_status"/>
</resultMap>
<select id="selectCustomErpProjectAcceptanceVoList" resultMap="ErpProjectAcceptanceResult">
select t.acceptance_id, t.project_id, t.tenant_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.acceptance_date, t.oss_id, t.acceptance_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.acceptance_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_acceptance t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
${ew.getCustomSqlSegment}
</select>
<!-- 根据ID查询详情 -->
<select id="selectCustomErpProjectAcceptanceVoById" resultMap="ErpProjectAcceptanceResult">
select t.acceptance_id, t.project_id, t.tenant_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.acceptance_date, t.oss_id, t.acceptance_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.acceptance_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_acceptance t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
where t.acceptance_id = #{acceptanceId}
</select>
<!-- 批量查询 - 根据ID列表 -->
<select id="selectCustomErpProjectAcceptanceVoByIds" resultMap="ErpProjectAcceptanceResult">
select t.acceptance_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.acceptance_date, t.oss_id, t.acceptance_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.acceptance_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_acceptance t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
where t.acceptance_id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 统计查询 -->
<select id="countCustomErpProjectAcceptance" resultType="java.lang.Long">
select count(1) from erp_project_acceptance t
${ew.getCustomSqlSegment}
</select>
<!-- 分页查询(带自定义条件) -->
<select id="selectCustomErpProjectAcceptanceVoPage" resultMap="ErpProjectAcceptanceResult">
select t.acceptance_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.acceptance_date, t.oss_id, t.acceptance_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.acceptance_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_acceptance t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
${ew.getCustomSqlSegment}
</select>
<!-- 批量插入 -->
<insert id="batchInsertErpProjectAcceptance">
insert into erp_project_acceptance(
tenant_id,
project_id,
project_code,
project_name,
manager_id,
acceptance_date,
oss_id,
acceptance_code,
charge_id,
deputy_id,
remark,
del_flag,
create_dept,
create_by,
create_time,
update_by,
update_time
)
values
<foreach collection="list" item="item" separator=",">
(
#{item.tenantId},
#{item.projectId},
#{item.projectCode},
#{item.projectName},
#{item.managerId},
#{item.acceptanceDate},
#{item.ossId},
#{item.acceptanceCode},
#{item.chargeId},
#{item.deputyId},
#{item.remark},
#{item.delFlag},
#{item.createDept},
#{item.createBy},
#{item.createTime},
#{item.updateBy},
#{item.updateTime}
)
</foreach>
</insert>
<!-- 批量更新 -->
<update id="batchUpdateErpProjectAcceptance">
<foreach collection="list" item="item" separator=";">
update erp_project_acceptance
<set>
<if test="item.tenantId != null and item.tenantId != ''">
tenant_id = #{item.tenantId},
</if>
<if test="item.projectId != null">
project_id = #{item.projectId},
</if>
<if test="item.projectCode != null and item.projectCode != ''">
project_code = #{item.projectCode},
</if>
<if test="item.projectName != null and item.projectName != ''">
project_name = #{item.projectName},
</if>
<if test="item.managerId != null">
manager_id = #{item.managerId},
</if>
<if test="item.acceptanceDate != null">
acceptance_date = #{item.acceptanceDate},
</if>
<if test="item.ossId != null and item.ossId != ''">
oss_id = #{item.ossId},
</if>
<if test="item.acceptanceCode != null and item.acceptanceCode != ''">
acceptance_code = #{item.acceptanceCode},
</if>
<if test="item.chargeId != null">
charge_id = #{item.chargeId},
</if>
<if test="item.deputyId != null">
deputy_id = #{item.deputyId},
</if>
<if test="item.remark != null and item.remark != ''">
remark = #{item.remark},
</if>
<if test="item.delFlag != null and item.delFlag != ''">
del_flag = #{item.delFlag},
</if>
<if test="item.createDept != null">
create_dept = #{item.createDept},
</if>
<if test="item.createBy != null">
create_by = #{item.createBy},
</if>
<if test="item.createTime != null">
create_time = #{item.createTime},
</if>
<if test="item.updateBy != null">
update_by = #{item.updateBy},
</if>
<if test="item.updateTime != null">
update_time = #{item.updateTime}
</if>
</set>
where acceptance_id = #{item.acceptanceId}
</foreach>
</update>
<!-- 根据自定义条件删除 -->
<delete id="deleteCustomErpProjectAcceptance">
delete from erp_project_acceptance
${ew.getCustomSqlSegment}
</delete>
<!-- 根据ID列表批量删除 -->
<delete id="deleteCustomErpProjectAcceptanceByIds">
delete from erp_project_acceptance
where acceptance_id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!-- 检查是否存在 -->
<select id="existsErpProjectAcceptance" resultType="java.lang.Boolean">
select count(1) > 0 from erp_project_acceptance t
${ew.getCustomSqlSegment}
</select>
</mapper>

@ -7,7 +7,7 @@
</resultMap>
<select id="selectCustomErpProjectChangeVoList" resultMap="ErpProjectChangeResult">
select t.project_change_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.project_category,
select t.project_change_id, t.project_change_code, t.tenant_id, t.project_id, t.project_code, t.project_name, t.project_category,
t.change_type, t.change_number, t.project_manager_id, t.dept_head_id, t.responsible_vp_id,
t.apply_change_date, t.contract_amount, t.contract_net_amount, t.current_status, t.change_reason,
t.follow_up_work, t.project_change_status, t.flow_status, t.remark, t.active_flag, t.del_flag,
@ -26,7 +26,7 @@
<!-- 根据ID查询详情 -->
<select id="selectCustomErpProjectChangeVoById" resultMap="ErpProjectChangeResult">
select t.project_change_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.project_category,
select t.project_change_id, t.project_change_code, t.tenant_id, t.project_id, t.project_code, t.project_name, t.project_category,
t.change_type, t.change_number, t.project_manager_id, t.dept_head_id, t.responsible_vp_id,
t.apply_change_date, t.contract_amount, t.contract_net_amount, t.current_status, t.change_reason,
t.follow_up_work, t.project_change_status, t.flow_status, t.remark, t.active_flag, t.del_flag,
@ -45,7 +45,7 @@
<!-- 批量查询 - 根据ID列表 -->
<select id="selectCustomErpProjectChangeVoByIds" resultMap="ErpProjectChangeResult">
select project_change_id, tenant_id, project_id, project_code, project_name, project_category, change_type, change_number, project_manager_id, project_manager_name, dept_head_id, dept_head_name, responsible_vp_id, responsible_vp_name, apply_change_date, contract_amount, contract_net_amount, current_status, change_reason, follow_up_work, project_change_status, flow_status, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time
select project_change_id, project_change_code, tenant_id, project_id, project_code, project_name, project_category, change_type, change_number, project_manager_id, project_manager_name, dept_head_id, dept_head_name, responsible_vp_id, responsible_vp_name, apply_change_date, contract_amount, contract_net_amount, current_status, change_reason, follow_up_work, project_change_status, flow_status, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time
from erp_project_change t
where t.project_change_id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
@ -61,7 +61,7 @@
<!-- 分页查询(带自定义条件) -->
<select id="selectCustomErpProjectChangeVoPage" resultMap="ErpProjectChangeResult">
select project_change_id, tenant_id, project_id, project_code, project_name, project_category, change_type, change_number, project_manager_id, project_manager_name, dept_head_id, dept_head_name, responsible_vp_id, responsible_vp_name, apply_change_date, contract_amount, contract_net_amount, current_status, change_reason, follow_up_work, project_change_status, flow_status, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time
select project_change_id, project_change_code, tenant_id, project_id, project_code, project_name, project_category, change_type, change_number, project_manager_id, project_manager_name, dept_head_id, dept_head_name, responsible_vp_id, responsible_vp_name, apply_change_date, contract_amount, contract_net_amount, current_status, change_reason, follow_up_work, project_change_status, flow_status, remark, active_flag, del_flag, create_dept, create_by, create_time, update_by, update_time
from erp_project_change t
${ew.getCustomSqlSegment}
</select>
@ -73,6 +73,8 @@
project_id,
project_change_code,
project_code,
project_name,
@ -135,6 +137,8 @@
#{item.projectId},
#{item.projectChangeCode},
#{item.projectCode},
#{item.projectName},
@ -204,6 +208,9 @@
<if test="item.projectId != null">
project_id = #{item.projectId},
</if>
<if test="item.projectChangeCode != null and item.projectChangeCode != ''">
project_change_code = #{item.projectChangeCode},
</if>
<if test="item.projectCode != null and item.projectCode != ''">
project_code = #{item.projectCode},
</if>

@ -10,6 +10,7 @@
select t.project_plan_id,
t.tenant_id,
t.project_id,
t.project_plan_code,
t.manager_id,
t.charge_id,
t.payment_method,
@ -17,6 +18,7 @@
t.flow_status,
t.sort_order,
t.contract_id,
t.oss_id,
t.remark,
t.active_flag,
t.del_flag,
@ -27,14 +29,16 @@
t.update_time,
p.project_name,
u1.nick_name as managerName,
d1.dept_name as managerDeptName,
u2.nick_name as chargeName,
c.contract_name as contractName,
u3.nick_name as createName
from erp_project_plan 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_dept d1 on u1.dept_id = d1.dept_id
left join sys_user u2 on t.charge_id = u2.user_id
left join sys_user u3 on t.create_by = u3.user_id
left join sys_user u3 on t.create_by = u3.user_id
left join erp_contract_info c on t.contract_id = c.contract_id
${ew.getCustomSqlSegment}
</select>
@ -44,6 +48,7 @@
select t.project_plan_id,
t.tenant_id,
t.project_id,
t.project_plan_code,
t.manager_id,
t.charge_id,
t.payment_method,
@ -51,6 +56,7 @@
t.flow_status,
t.sort_order,
t.contract_id,
t.oss_id,
t.remark,
t.active_flag,
t.del_flag,
@ -61,11 +67,13 @@
t.update_time,
p.project_name,
u1.nick_name as managerName,
d1.dept_name as managerDeptName,
u2.nick_name as chargeName,
c.contract_name as contractName
from erp_project_plan 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_dept d1 on u1.dept_id = d1.dept_id
left join sys_user u2 on t.charge_id = u2.user_id
left join erp_contract_info c on t.contract_id = c.contract_id
where t.project_plan_id = #{projectPlanId}
@ -76,6 +84,7 @@
select t.project_plan_id,
t.tenant_id,
t.project_id,
t.project_plan_code,
t.manager_id,
t.charge_id,
t.payment_method,
@ -83,6 +92,7 @@
t.flow_status,
t.sort_order,
t.contract_id,
t.oss_id,
t.remark,
t.active_flag,
t.del_flag,
@ -93,11 +103,13 @@
t.update_time,
p.project_name,
u1.nick_name as managerName,
d1.dept_name as managerDeptName,
u2.nick_name as chargeName,
c.contract_name as contractName
from erp_project_plan 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_dept d1 on u1.dept_id = d1.dept_id
left join sys_user u2 on t.charge_id = u2.user_id
left join erp_contract_info c on t.contract_id = c.contract_id
where t.project_plan_id in
@ -117,6 +129,7 @@
select t.project_plan_id,
t.tenant_id,
t.project_id,
t.project_plan_code,
t.manager_id,
t.charge_id,
t.payment_method,
@ -124,6 +137,7 @@
t.flow_status,
t.sort_order,
t.contract_id,
t.oss_id,
t.remark,
t.active_flag,
t.del_flag,
@ -134,11 +148,13 @@
t.update_time,
p.project_name,
u1.nick_name as managerName,
d1.dept_name as managerDeptName,
u2.nick_name as chargeName,
c.contract_name as contractName
from erp_project_plan 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_dept d1 on u1.dept_id = d1.dept_id
left join sys_user u2 on t.charge_id = u2.user_id
left join erp_contract_info c on t.contract_id = c.contract_id
${ew.getCustomSqlSegment}
@ -151,6 +167,8 @@
project_id,
project_plan_code,
manager_id,
charge_id,
@ -165,6 +183,8 @@
contract_id,
oss_id,
remark,
active_flag,
@ -189,6 +209,8 @@
#{item.projectId},
#{item.projectPlanCode},
#{item.managerId},
#{item.chargeId},
@ -203,6 +225,8 @@
#{item.contractId},
#{item.ossId},
#{item.remark},
#{item.activeFlag},
@ -234,6 +258,9 @@
<if test="item.projectId != null">
project_id = #{item.projectId},
</if>
<if test="item.projectPlanCode != null and item.projectPlanCode != ''">
project_plan_code = #{item.projectPlanCode},
</if>
<if test="item.managerId != null">
manager_id = #{item.managerId},
</if>
@ -255,6 +282,9 @@
<if test="item.contractId != null">
contract_id = #{item.contractId},
</if>
<if test="item.ossId != null and item.ossId != ''">
oss_id = #{item.ossId},
</if>
<if test="item.remark != null and item.remark != ''">
remark = #{item.remark},
</if>

@ -7,32 +7,44 @@
</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,
p.dept_id,
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,97 @@
<?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 t.material_cost_id as relation_details_id,
0 as spare_flag,
null as purchase_plan_flag,
case when t.material_id is not null then 1 else 0 end as material_flag,
t.material_id,
t.relation_material_id,
t.material_code as material_code,
t.material_name as material_name,
t.remark as specification_description,
t.unit_id,
u.unit_name,
t.amount as need_purchase_amount,
t.amount as purchase_amount,
t.material_code as relation_material_code,
t.material_name as relation_material_name
from erp_budget_material_cost t
left join base_unit_info u on u.unit_id = t.unit_id
where t.del_flag = '0'
and t.project_id = #{projectId}
order by t.material_cost_id asc
</select>
</mapper>

@ -0,0 +1,243 @@
<?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">
<mapper namespace="org.dromara.oa.erp.mapper.ErpProjectReceivingMapper">
<resultMap type="org.dromara.oa.erp.domain.vo.ErpProjectReceivingVo" id="ErpProjectReceivingResult">
<id property="receivingId" column="receiving_id"/>
<result property="projectId" column="project_id"/>
<result property="projectCode" column="project_code"/>
<result property="projectName" column="project_name"/>
<result property="managerId" column="manager_id"/>
<result property="projectManagerName" column="projectManagerName"/>
<result property="arrivalDate" column="arrival_date"/>
<result property="ossId" column="oss_id"/>
<result property="receivingCode" column="receiving_code"/>
<result property="chargeId" column="charge_id"/>
<result property="chargeName" column="chargeName"/>
<result property="deputyId" column="deputy_id"/>
<result property="deputyName" column="deputyName"/>
<result property="remark" column="remark"/>
<result property="receivingStatus" column="receiving_status"/>
<result property="flowStatus" column="flow_status"/>
</resultMap>
<select id="selectCustomErpProjectReceivingVoList" resultMap="ErpProjectReceivingResult">
select t.receiving_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.arrival_date, t.oss_id, t.receiving_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.receiving_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_receiving t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
${ew.getCustomSqlSegment}
</select>
<!-- 根据ID查询详情 -->
<select id="selectCustomErpProjectReceivingVoById" resultMap="ErpProjectReceivingResult">
select t.receiving_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.arrival_date, t.oss_id, t.receiving_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.receiving_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_receiving t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
where t.receiving_id = #{receivingId}
</select>
<!-- 批量查询 - 根据ID列表 -->
<select id="selectCustomErpProjectReceivingVoByIds" resultMap="ErpProjectReceivingResult">
select t.receiving_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.arrival_date, t.oss_id, t.receiving_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.receiving_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_receiving t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
where t.receiving_id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 统计查询 -->
<select id="countCustomErpProjectReceiving" resultType="java.lang.Long">
select count(1) from erp_project_receiving t
${ew.getCustomSqlSegment}
</select>
<!-- 分页查询(带自定义条件) -->
<select id="selectCustomErpProjectReceivingVoPage" resultMap="ErpProjectReceivingResult">
select t.receiving_id, t.tenant_id, t.project_id, t.project_code, t.project_name, t.manager_id, u1.nick_name as projectManagerName,
t.arrival_date, t.oss_id, t.receiving_code,
t.charge_id, u3.nick_name as chargeName, t.deputy_id, u4.nick_name as deputyName, t.remark, t.receiving_status, t.flow_status, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time
from erp_project_receiving t
left join sys_user u1 on t.manager_id = u1.user_id
left join sys_user u3 on t.charge_id = u3.user_id
left join sys_user u4 on t.deputy_id = u4.user_id
${ew.getCustomSqlSegment}
</select>
<!-- 批量插入 -->
<insert id="batchInsertErpProjectReceiving">
insert into erp_project_receiving(
tenant_id,
project_id,
project_code,
project_name,
manager_id,
arrival_date,
oss_id,
receiving_code,
charge_id,
deputy_id,
remark,
del_flag,
create_dept,
create_by,
create_time,
update_by,
update_time
)
values
<foreach collection="list" item="item" separator=",">
(
#{item.tenantId},
#{item.projectId},
#{item.projectCode},
#{item.projectName},
#{item.managerId},
#{item.arrivalDate},
#{item.ossId},
#{item.receivingCode},
#{item.chargeId},
#{item.deputyId},
#{item.remark},
#{item.delFlag},
#{item.createDept},
#{item.createBy},
#{item.createTime},
#{item.updateBy},
#{item.updateTime}
)
</foreach>
</insert>
<!-- 批量更新 -->
<update id="batchUpdateErpProjectReceiving">
<foreach collection="list" item="item" separator=";">
update erp_project_receiving
<set>
<if test="item.tenantId != null and item.tenantId != ''">
tenant_id = #{item.tenantId},
</if>
<if test="item.projectId != null">
project_id = #{item.projectId},
</if>
<if test="item.projectCode != null and item.projectCode != ''">
project_code = #{item.projectCode},
</if>
<if test="item.projectName != null and item.projectName != ''">
project_name = #{item.projectName},
</if>
<if test="item.managerId != null">
manager_id = #{item.managerId},
</if>
<if test="item.arrivalDate != null">
arrival_date = #{item.arrivalDate},
</if>
<if test="item.ossId != null and item.ossId != ''">
oss_id = #{item.ossId},
</if>
<if test="item.receivingCode != null and item.receivingCode != ''">
receiving_code = #{item.receivingCode},
</if>
<if test="item.chargeId != null">
charge_id = #{item.chargeId},
</if>
<if test="item.deputyId != null">
deputy_id = #{item.deputyId},
</if>
<if test="item.remark != null and item.remark != ''">
remark = #{item.remark},
</if>
<if test="item.delFlag != null and item.delFlag != ''">
del_flag = #{item.delFlag},
</if>
<if test="item.createDept != null">
create_dept = #{item.createDept},
</if>
<if test="item.createBy != null">
create_by = #{item.createBy},
</if>
<if test="item.createTime != null">
create_time = #{item.createTime},
</if>
<if test="item.updateBy != null">
update_by = #{item.updateBy},
</if>
<if test="item.updateTime != null">
update_time = #{item.updateTime}
</if>
</set>
where receiving_id = #{item.receivingId}
</foreach>
</update>
<!-- 根据自定义条件删除 -->
<delete id="deleteCustomErpProjectReceiving">
delete from erp_project_receiving
${ew.getCustomSqlSegment}
</delete>
<!-- 根据ID列表批量删除 -->
<delete id="deleteCustomErpProjectReceivingByIds">
delete from erp_project_receiving
where receiving_id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!-- 检查是否存在 -->
<select id="existsErpProjectReceiving" resultType="java.lang.Boolean">
select count(1) > 0 from erp_project_receiving t
${ew.getCustomSqlSegment}
</select>
</mapper>
Loading…
Cancel
Save