@@ -30,23 +30,12 @@ public class TenderStateChangeAction { | |||
} | |||
/** | |||
* 填写采购信息 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_PURCHASE_INFO", target = "TO_BE_SUBMIT_CONSTRUCTION_INFO") | |||
public void SUBMIT_PURCHASE_INFO(Message<ProjectStateChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatus.TO_BE_SUBMIT_CONSTRUCTION_INFO.getCode()); | |||
} | |||
/** | |||
* 填写合同信息 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_CONSTRUCTION_INFO", target = "TO_BE_SUBMIT_OPERATION_PLAN") | |||
public void SUBMIT_CONSTRUCTION_INFO(Message<ProjectStateChangeEvent> message) { | |||
@OnTransition(source = "TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO", target = "TO_BE_SUBMIT_OPERATION_PLAN") | |||
public void SUBMIT_PURCHASE_CONSTRUCTION_INFO(Message<ProjectStateChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatus.TO_BE_SUBMIT_OPERATION_PLAN.getCode()); | |||
} | |||
@@ -65,21 +65,15 @@ public class TenderStateMachineBuilderImpl implements BaseStateMachineBuilder<Pu | |||
builder.configureStates() | |||
.withStates() | |||
.initial(TenderStatus.TO_BE_SUBMIT_PURCHASE_INFO) | |||
.initial(TenderStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO) | |||
.states(EnumSet.allOf(TenderStatus.class)); | |||
builder.configureTransitions() | |||
// 填写采购信息 | |||
// 填写采购&合同信息 | |||
.withExternal() | |||
.source(TenderStatus.TO_BE_SUBMIT_PURCHASE_INFO) | |||
.target(TenderStatus.TO_BE_SUBMIT_CONSTRUCTION_INFO) | |||
.event(TenderStateChangeEvent.SUBMIT_PURCHASE_INFO) | |||
.and() | |||
// 填写合同信息 | |||
.withExternal() | |||
.source(TenderStatus.TO_BE_SUBMIT_CONSTRUCTION_INFO) | |||
.source(TenderStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO) | |||
.target(TenderStatus.TO_BE_SUBMIT_OPERATION_PLAN) | |||
.event(TenderStateChangeEvent.SUBMIT_CONSTRUCTION_INFO) | |||
.event(TenderStateChangeEvent.SUBMIT_PURCHASE_CONSTRUCTION_INFO) | |||
.and() | |||
// 填写实施计划 | |||
.withExternal() | |||
@@ -16,13 +16,9 @@ import lombok.Getter; | |||
public enum TenderStateChangeEvent implements AbstractStateChangeEvent { | |||
/** | |||
* 填写采购信息 | |||
* 填写采购&合同信息 | |||
*/ | |||
SUBMIT_PURCHASE_INFO(101, null, null), | |||
/** | |||
* 填写合同信息 | |||
*/ | |||
SUBMIT_CONSTRUCTION_INFO(102, null, null), | |||
SUBMIT_PURCHASE_CONSTRUCTION_INFO(101, null, null), | |||
/** | |||
* 填写实施计划 | |||
*/ | |||
@@ -4,8 +4,6 @@ import com.hz.pm.api.common.util.ExcelDownUtil; | |||
import com.hz.pm.api.projectdeclared.manage.ConstructionManage; | |||
import com.hz.pm.api.projectdeclared.model.dto.PaymentPlanSupplementDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.PreInsSaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.XcfhxApplySaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitConstructionReq; | |||
import com.hz.pm.api.projectdeclared.model.req.XcfhxApplyReq; | |||
import com.hz.pm.api.projectdeclared.model.vo.ContractVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.PreInsVO; | |||
@@ -65,13 +63,6 @@ public class ConstructionController { | |||
return constructionManage.detailContractByProjectId(projectId); | |||
} | |||
@ApiOperation(value = "填写合同信息") | |||
@WebLog("填写合同信息") | |||
@PostMapping("/submit-contract") | |||
public String submitContract(@Validated @RequestBody SubmitConstructionReq req) { | |||
return constructionManage.submitPurchaseContract(req); | |||
} | |||
@ApiOperation(value = "补充实际支付金额", notes = "补充实际支付金额") | |||
@WebLog("补充实际支付金额") | |||
@PostMapping("/supplement") | |||
@@ -74,10 +74,10 @@ public class PurchaseController { | |||
purchaseManage.submitPurchaseNotice(req); | |||
} | |||
@ApiOperation("采购信息备案") | |||
@WebLog("采购信息备案") | |||
@ApiOperation("采购&合同信息备案") | |||
@WebLog("采购&合同信息备案") | |||
@PostMapping("/record/submit") | |||
public void submitPurchaseRecord(@RequestBody SubmitPurchaseRecordReq req) { | |||
public void submitPurchaseRecord(@RequestBody SubmitPurchaseContractRecordReq req) { | |||
purchaseManage.submitPurchaseRecord(req); | |||
} | |||
@@ -136,7 +136,7 @@ public class PurchaseController { | |||
@WebLog("新增系统(信创审符合性查信息)") | |||
@PostMapping("/add-system") | |||
public Long addSystem(@Validated @RequestBody XcfhxApplySaveDTO dto) { | |||
return purchaseManage.addSystem(dto); | |||
return purchaseManage.addSystem(dto); | |||
} | |||
@ApiOperation("编辑信创审符合性查信息") | |||
@@ -154,8 +154,8 @@ public class PurchaseController { | |||
@GetMapping("/exportXcfhFile/{code}") | |||
@ApiOperation("直接导出信创文件") | |||
public void exportXcfhFile(@PathVariable String code,HttpServletResponse response) throws UnsupportedEncodingException { | |||
purchaseManage.exportXcfhFile(code,response); | |||
public void exportXcfhFile(@PathVariable String code, HttpServletResponse response) throws UnsupportedEncodingException { | |||
purchaseManage.exportXcfhFile(code, response); | |||
} | |||
@GetMapping("/purchaseIntention/{unitId}") | |||
@@ -14,7 +14,6 @@ import com.hz.pm.api.common.model.constant.BizConst; | |||
import com.hz.pm.api.common.statemachine.util.ProjectStateMachineUtil; | |||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||
import com.hz.pm.api.common.statemachine.util.XcfhxStateMachineUtil; | |||
import com.hz.pm.api.common.util.DecimalUtil; | |||
import com.hz.pm.api.common.util.ExcelDownUtil; | |||
import com.hz.pm.api.common.util.ExcelExportStyle; | |||
import com.hz.pm.api.common.util.StrUtils; | |||
@@ -22,9 +21,7 @@ import com.hz.pm.api.projectdeclared.helper.MhXchxFileHelper; | |||
import com.hz.pm.api.projectdeclared.model.dto.DeclaredProjectExportDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.PaymentPlanSupplementDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.PreInsSaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.XcfhxApplySaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.entity.*; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitConstructionReq; | |||
import com.hz.pm.api.projectdeclared.model.req.XcfhxApplyReq; | |||
import com.hz.pm.api.projectdeclared.model.vo.ContractVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.PreInsAcceptancePersonVO; | |||
@@ -289,53 +286,6 @@ public class ConstructionManage { | |||
return BeanUtil.copyToList(contracts, ContractVO.class); | |||
} | |||
@Transactional(rollbackFor = Exception.class) | |||
public synchronized String submitPurchaseContract(SubmitConstructionReq req) { | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
Long projectId = req.getProjectId(); | |||
Project project = projectService.getNewestNoNull(req.getProjectId()); | |||
//首先要判断 项目当前状态 是不是 采购结果备案 | |||
VUtils.isTrue(!ProjectStatus.ON_PURCHASING.getCode().equals(project.getStatus()) || | |||
!ProjectStatus.PROJECT_APPROVED.getCode().equals(project.getStage())) | |||
.throwMessage("提交失败 该项目不是 建设中或者已立项阶段"); | |||
Purchase purchase = purchaseService.getById(req.getBidId()); | |||
if (!TenderStatus.TO_BE_SUBMIT_CONSTRUCTION_INFO.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段不支持填写合同信息"); | |||
} | |||
tenderStateMachineUtil.pass(purchase); | |||
purchaseService.updateById(purchase); | |||
LocalDateTime now = LocalDateTime.now(); | |||
Contract contract = new Contract(); | |||
contract.setContractTime(req.getContractTime()); | |||
contract.setAttachment(req.getAttachment()); | |||
contract.setName(req.getName()); | |||
contract.setProjectId(projectId); | |||
contract.setProjectCode(project.getProjectCode()); | |||
contract.setBidId(req.getBidId()); | |||
contract.setId(req.getConstructionId()); | |||
contract.setCreateBy(user.getUserIdStr()); | |||
contract.setUpdateBy(user.getUserIdStr()); | |||
contract.setCreateOn(now); | |||
contract.setUpdateOn(now); | |||
contract.setTotalAmount(req.getTotalAmount()); | |||
contract.setConstructionNo(req.getConstructionNo()); | |||
contract.setSupplierContact(req.getSupplierContact()); | |||
contract.setSupplierContactInfo(req.getSupplierContactInfo()); | |||
contractService.saveOrUpdate(contract); | |||
LambdaQueryWrapper<Contract> query = Wrappers.lambdaQuery(Contract.class) | |||
.eq(Contract::getProjectId, projectId); | |||
List<Contract> allContracts = contractService.list(query); | |||
BigDecimal totalAmount = DecimalUtil.sum(allContracts, Contract::getTotalAmount); | |||
project.setUpdateOn(now); | |||
project.setContractAmount(totalAmount); | |||
projectService.updateById(project); | |||
return "填写成功"; | |||
} | |||
private static final List<TenderStatus> PRE_INSPECTED_PURCHASE_STATUS; | |||
static { | |||
@@ -600,7 +550,7 @@ public class ConstructionManage { | |||
if (StrUtils.isBlank(purchase.getMhXcfhxReportFile()) || | |||
req.getMhXcfhxReportFile().equals(purchase.getMhXcfhxReportFile())) { | |||
String fileName = purchase.getBidName() + "-信创符合性测评报告."; | |||
purchase.setXcfhxReportFiles(mhXchxFileHelper.getXchxFile(req.getMhXcfhxReportFile(),fileName)); | |||
purchase.setXcfhxReportFiles(mhXchxFileHelper.getXchxFile(req.getMhXcfhxReportFile(), fileName)); | |||
} | |||
purchase.setMhXcfhxReportRecordId(req.getMhXcfhxReportRecordId()); | |||
purchase.setMhXcfhxReportFile(req.getMhXcfhxReportFile()); | |||
@@ -621,7 +571,7 @@ public class ConstructionManage { | |||
public synchronized String submitXcfhxApplyManual(Long id) { | |||
Xinchuang xinhcuang = xinchuangService.getById(id); | |||
VUtils.isTrue(Objects.isNull(xinhcuang)).throwMessage("信创符合性申请不存在"); | |||
if(StringUtils.isNotBlank(xinhcuang.getInstCode())){ | |||
if (StringUtils.isNotBlank(xinhcuang.getInstCode())) { | |||
List<Task> tasks = taskService.createTaskQuery().active() | |||
.processInstanceId(xinhcuang.getInstCode()) | |||
.list(); | |||
@@ -48,7 +48,7 @@ import com.hz.pm.api.projectlib.entity.PurchaseStatusChange; | |||
import com.hz.pm.api.projectlib.helper.ProjectManageUtil; | |||
import com.hz.pm.api.projectlib.model.entity.Project; | |||
import com.hz.pm.api.projectlib.model.entity.ProjectInst; | |||
import com.hz.pm.api.projectlib.model.enumeration.*; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.status.*; | |||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | |||
@@ -78,6 +78,7 @@ import org.springframework.beans.BeanUtils; | |||
import org.springframework.beans.factory.annotation.Value; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.IOException; | |||
import java.io.UnsupportedEncodingException; | |||
@@ -338,7 +339,7 @@ public class PurchaseManage { | |||
purchase.setSelfTestStatus(TenderSelfTestStatus.WITHOUT_SELF_TEST_INFO.getCode()); | |||
purchase.setTestValidStatus(TenderTestValidStatus.WITHOUT_TEST_VALID_INFO.getCode()); | |||
purchase.setAdaptStatus(TenderAdaptStatus.WITHOUT_ADAPT_INFO.getCode()); | |||
purchase.setStatus(TenderStatus.TO_BE_SUBMIT_PURCHASE_INFO.getCode()); | |||
purchase.setStatus(TenderStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO.getCode()); | |||
purchase.setXcfhxApplyStatus(TenderXcfhxApplyStatus.TO_BE_SUBMIT_XCFHX_APPLY.getCode()); | |||
if (Boolean.TRUE.equals(mhPurchaseNoticeOpen)) { | |||
notices.add(buildPurchaseNotice(w, user)); | |||
@@ -398,11 +399,12 @@ public class PurchaseManage { | |||
} | |||
@Transactional(rollbackFor = Exception.class) | |||
public synchronized void submitPurchaseRecord(SubmitPurchaseRecordReq req) { | |||
public synchronized void submitPurchaseRecord(SubmitPurchaseContractRecordReq req) { | |||
Purchase purchase = purchaseService.getById(req.getBidId()); | |||
if (!TenderStatus.TO_BE_SUBMIT_PURCHASE_INFO.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段无法进行采购信息备案"); | |||
if (!TenderStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段无法进行采购&合同信息备案"); | |||
} | |||
// 保存采购信息 | |||
purchase.setId(req.getBidId()); | |||
purchase.setAcceptanceLetter(req.getAcceptanceLetter()); | |||
purchase.setBidBuildContent(req.getBidBuildContent()); | |||
@@ -412,6 +414,41 @@ public class PurchaseManage { | |||
purchase.setBidType(req.getBidType()); | |||
tenderStateMachineUtil.pass(purchase); | |||
purchaseService.saveOrUpdate(purchase); | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
Long projectId = req.getProjectId(); | |||
Project project = projectService.getNewestNoNull(projectId); | |||
LocalDateTime now = LocalDateTime.now(); | |||
// 保存合同信息 | |||
Contract contract = contractService.getByBidId(req.getBidId()); | |||
if (contract == null) { | |||
contract = new Contract(); | |||
contract.setCreateBy(user.getUserIdStr()); | |||
contract.setCreateOn(now); | |||
} | |||
contract.setContractTime(req.getContractTime()); | |||
contract.setAttachment(req.getAttachment()); | |||
contract.setName(req.getName()); | |||
contract.setProjectId(projectId); | |||
contract.setProjectCode(project.getProjectCode()); | |||
contract.setBidId(req.getBidId()); | |||
contract.setId(req.getConstructionId()); | |||
contract.setUpdateBy(user.getUserIdStr()); | |||
contract.setUpdateOn(now); | |||
contract.setTotalAmount(req.getTotalAmount()); | |||
contract.setConstructionNo(req.getConstructionNo()); | |||
contract.setSupplierContact(req.getSupplierContact()); | |||
contract.setSupplierContactInfo(req.getSupplierContactInfo()); | |||
contractService.saveOrUpdate(contract); | |||
// 修改项目合同金额 | |||
Wrapper<Contract> query = Wrappers.lambdaQuery(Contract.class) | |||
.eq(Contract::getProjectId, projectId); | |||
List<Contract> allContracts = contractService.list(query); | |||
BigDecimal totalAmount = DecimalUtil.sum(allContracts, Contract::getTotalAmount); | |||
project.setUpdateOn(now); | |||
project.setContractAmount(totalAmount); | |||
projectService.updateById(project); | |||
} | |||
private PageVo<TestValidListVO> queryData(TestValidListReq req, | |||
@@ -684,12 +721,13 @@ public class PurchaseManage { | |||
/** | |||
* 详情 | |||
* | |||
* @param id | |||
* @return | |||
*/ | |||
public XinchuangVO detailXcfhxApply(Long id) { | |||
Xinchuang xinchuang = xinchuangService.getById(id); | |||
if(Objects.isNull(xinchuang)){ | |||
if (Objects.isNull(xinchuang)) { | |||
return null; | |||
} | |||
return BeanUtil.copyProperties(xinchuang, XinchuangVO.class); | |||
@@ -721,6 +759,7 @@ public class PurchaseManage { | |||
/** | |||
* 新增信创系统 | |||
* | |||
* @param dto | |||
* @return | |||
*/ | |||
@@ -733,7 +772,7 @@ public class PurchaseManage { | |||
xinchuang.setXcfhxReportFiles(mhXchxFileHelper.getXchxFile(dto.getMhXcfhxReportFile(), fileName)); | |||
} | |||
} | |||
if(xinchuangService.save(xinchuang)){ | |||
if (xinchuangService.save(xinchuang)) { | |||
return xinchuang.getId(); | |||
} | |||
throw BizException.wrap("新增失败"); | |||
@@ -748,7 +787,7 @@ public class PurchaseManage { | |||
String fileName = xinchuang.getBidName() + "-信创符合性测评报告."; | |||
xinchuang.setXcfhxReportFiles(mhXchxFileHelper.getXchxFile(dto.getMhXcfhxReportFile(), fileName)); | |||
} | |||
if(xinchuangService.updateById(xinchuang)){ | |||
if (xinchuangService.updateById(xinchuang)) { | |||
return xinchuang.getId(); | |||
} | |||
throw BizException.wrap("编辑失败"); | |||
@@ -758,7 +797,7 @@ public class PurchaseManage { | |||
return mhXchxFileHelper.getXchxFile(code, null); | |||
} | |||
public void exportXcfhFile(String code,HttpServletResponse response) throws UnsupportedEncodingException { | |||
public void exportXcfhFile(String code, HttpServletResponse response) throws UnsupportedEncodingException { | |||
mhXchxFileHelper.exportReport(code, response); | |||
} | |||
} |
@@ -1,7 +1,6 @@ | |||
package com.hz.pm.api.projectdeclared.model.req; | |||
import com.fasterxml.jackson.annotation.JsonFormat; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
@@ -11,26 +10,45 @@ import java.time.LocalDateTime; | |||
/** | |||
* <p> | |||
* SubmitConstructionReq | |||
* SubmitPurchaseContractRecordReq | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 00:14 2024/2/23 | |||
* @since 13:55 2024/7/9 | |||
*/ | |||
@Data | |||
@ApiModel(value = "合同对象") | |||
public class SubmitConstructionReq { | |||
public class SubmitPurchaseContractRecordReq { | |||
@ApiModelProperty("项目ID") | |||
@NotNull(message = "项目ID不能为空") | |||
@NotNull(message = "请传项目ID") | |||
private Long projectId; | |||
@ApiModelProperty("合同ID") | |||
private Long constructionId; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("标段类型") | |||
private Integer bidType; | |||
@ApiModelProperty("供应商") | |||
private String supplier; | |||
@ApiModelProperty("供应商社会信用代码") | |||
private String supplierSocialCreditCode; | |||
@ApiModelProperty("投标文件") | |||
private String biddingDoc; | |||
@ApiModelProperty("中标通知书") | |||
private String acceptanceLetter; | |||
@ApiModelProperty("标段建设内容") | |||
private String bidBuildContent; | |||
// 合同信息 | |||
@ApiModelProperty("合同ID") | |||
private Long constructionId; | |||
@ApiModelProperty("合同名称") | |||
private String name; | |||
@@ -53,4 +71,5 @@ public class SubmitConstructionReq { | |||
@ApiModelProperty("供应商联系方式") | |||
private String supplierContactInfo; | |||
} |
@@ -1,48 +0,0 @@ | |||
package com.hz.pm.api.projectdeclared.model.req; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotEmpty; | |||
import javax.validation.constraints.NotNull; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* 采购信息备案提交参数类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 11:34 2024/2/22 | |||
*/ | |||
@Data | |||
@AllArgsConstructor | |||
public class SubmitPurchaseRecordReq { | |||
@ApiModelProperty("项目ID") | |||
@NotNull(message = "请传项目ID") | |||
private Long projectId; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("标段类型") | |||
private Integer bidType; | |||
@ApiModelProperty("供应商") | |||
private String supplier; | |||
@ApiModelProperty("供应商社会信用代码") | |||
private String supplierSocialCreditCode; | |||
@ApiModelProperty("投标文件") | |||
private String biddingDoc; | |||
@ApiModelProperty("中标通知书") | |||
private String acceptanceLetter; | |||
@ApiModelProperty("标段建设内容") | |||
private String bidBuildContent; | |||
} |
@@ -20,8 +20,7 @@ import java.util.Optional; | |||
@AllArgsConstructor | |||
public enum TenderStatus implements IStatus<Integer, String> { | |||
TO_BE_SUBMIT_PURCHASE_INFO(ProjectStatus.ON_PURCHASING, 101, "待填写采购信息"), | |||
TO_BE_SUBMIT_CONSTRUCTION_INFO(ProjectStatus.ON_PURCHASING, 102, "待填写合同信息"), | |||
TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO(ProjectStatus.ON_PURCHASING, 101, "待填写采购&合同信息"), | |||
TO_BE_SUBMIT_OPERATION_PLAN(ProjectStatus.ON_PURCHASING, 103, "待填写实施计划"), | |||
TO_BE_SUBMIT_FIRST_INSPECTED_INFO(ProjectStatus.TO_BE_FIRST_INSPECTED, 201, "待上传初验材料"), | |||
TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY(ProjectStatus.ON_PILOT_RUNNING, 401, "待终验申报"), | |||