commit 8a9a67b80502811e552675e38c6cd26fc5834962
Author: Jinyuanyuan <1197651512@qq.com>
Date: Fri Apr 19 15:46:27 2024 +0800
first commit
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..639900d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
TODO
+ * + * @author zg + * @since 2023/12/27 + */ +public enum NbErrorCode implements ErrorCode { + NO_LOGIN(HttpStatus.SC_BAD_REQUEST, "用户登陆数据错误"), + NOT_EXIST(HttpStatus.SC_BAD_REQUEST, "数据不存在"), + ERROR_DO(HttpStatus.SC_BAD_REQUEST, "执行错误"), + INVALID_PARAM(HttpStatus.SC_BAD_REQUEST, "参数错误"), + INVALID_ACTION(HttpStatus.SC_BAD_REQUEST, "错误操作") + ; + + private int httpStatusCode; + private String message; + NbErrorCode(int httpStatusCode, String message) { + this.httpStatusCode = httpStatusCode; + this.message = message; + } + + @Override + public String getModule() { + return "FIN"; + } + + @Override + public int getHttpStatusCode() { + return this.httpStatusCode; + } + + @Override + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/com/gy/pgcm/nb/enums/NbRecordTypeEnum.java b/src/main/java/com/gy/pgcm/nb/enums/NbRecordTypeEnum.java new file mode 100644 index 0000000..d481b86 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/enums/NbRecordTypeEnum.java @@ -0,0 +1,44 @@ +package com.gy.pgcm.nb.enums; + +import cn.bespinglobal.amg.common.base.IBaseEnum; + +/** + *NB记录类型Enum
+ * + * @author zg + * @since 2023/12/27 + */ +public enum NbRecordTypeEnum implements IBaseEnumTODO
+ * + * @author zg + * @since 2023/12/27 + */ +@Mapper +public interface NbLogMapper extends BaseMapperTODO
+ * + * @author zg + * @since 2023/12/27 + */ +@Mapper +public interface NbRecordMapper extends BaseMapper宁波数据接口调用日志
+ * + * @author zg + * @since 2023/12/27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("nb_log") +public class NbLogDO extends BaseEntity implements Serializable { + private static final long serialVersionUID = 5654901998048634425L; + + /** + * 日志类型 + */ + private String logType; + + /** + * 传入参数 + */ + private String logParam; + + /** + * 返回结果 + */ + private String logRes; + + /** + * 执行结果 + */ + private Integer isSuc; + + /** + * 错误信息 + */ + private String errMsg; +} diff --git a/src/main/java/com/gy/pgcm/nb/model/entity/NbRecordDO.java b/src/main/java/com/gy/pgcm/nb/model/entity/NbRecordDO.java new file mode 100644 index 0000000..f52fb43 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/entity/NbRecordDO.java @@ -0,0 +1,49 @@ +package com.gy.pgcm.nb.model.entity; + +import cn.bespinglobal.amg.common.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *宁波数据同步记录
+ * + * @author zg + * @since 2023/12/27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("nb_record") +public class NbRecordDO extends BaseEntity implements Serializable { + private static final long serialVersionUID = 4764199154617593360L; + + /** + * 记录类型 + */ + private String recordType; + + /** + * 记录key + */ + private String recordKey; + + /** + * 标记 0 + */ + private Integer recordFlag; + + /** + * 备注信息 + */ + private String remarks; + + /** + * 是否删除 0 正常; 1 已删除 + */ + private Integer isDelete; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbApproveCandidateItem.java b/src/main/java/com/gy/pgcm/nb/model/param/NbApproveCandidateItem.java new file mode 100644 index 0000000..5ff9dfe --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbApproveCandidateItem.java @@ -0,0 +1,22 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/27 + */ +@ApiModel("宁波系统数据接口-开票状态返回审批记录候选项结果") +@Data +public class NbApproveCandidateItem { + + @ApiModelProperty(value = "录候人员部门名称") + private String deptName; + + @ApiModelProperty(value = "录候人员名称") + private String staffName; +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbApproveItem.java b/src/main/java/com/gy/pgcm/nb/model/param/NbApproveItem.java new file mode 100644 index 0000000..ea6a404 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbApproveItem.java @@ -0,0 +1,39 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/27 + */ +@ApiModel("宁波系统数据接口-开票状态返回审批记录结果") +@Data +public class NbApproveItem { + + @ApiModelProperty(value = "审批步骤名称") + private String stepName; + + @ApiModelProperty(value = "审批候选人员列表") + private ListTODO
+ * + * @author zg + * @since 2023/12/26 + */ +@ApiModel("宁波系统数据接口-合同参数") +@Data +public class NbContractParam { + + /** + * 合同编号 + */ + @ApiModelProperty(value = "合同编号 新增时传空;修改时必传") + private String contractCode; + + /** + * 合同名称 + */ + @ApiModelProperty(value = "合同名称") + private String contractName; + +// /** +// * 合同类型 +// */ +// @NotNull +// @ApiModelProperty(value = "字典:合同类型(BizContractTypeEnum)", required = true) +// private Integer contractType; + + /** + * 项目编号 + */ + @ApiModelProperty(value = "项目编号", required = true) + private String projectNo; + + /** + * 合同金额 + */ + @ApiModelProperty(value = "合同金额 默认同项目金额") + private BigDecimal contractAmount; + + /** + * 是否高新 + */ + @ApiModelProperty(value = "销售合同-是否高新") + private Integer highTech = 0; + + /** + * 中标方式 + */ + @ApiModelProperty(value = "销售合同-中标方式 字典:中标方式("+ Dict.WINNING_BID_WAY +")", required = true) + private String winningBidWay; + + /** + * 签出 + */ + @ApiModelProperty(value = "签出", required = true) + private Integer signOut = 0; + + /** + * 签入 + */ + @ApiModelProperty(value = "签入", required = true) + private Integer signIn = 0; + + /** + * 确认日期 + */ + @ApiModelProperty(value = "确认日期 yyyy-MM-dd") + private String confirmDate; + +// /** +// * 销售合同-关联实施人员Code列表 +// */ +// @ApiModelProperty(value = "销售合同-关联实施人员Code列表 多个用,连接") +// private String implUserCodes; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbContractQueryParam.java b/src/main/java/com/gy/pgcm/nb/model/param/NbContractQueryParam.java new file mode 100644 index 0000000..aef4923 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbContractQueryParam.java @@ -0,0 +1,32 @@ +package com.gy.pgcm.nb.model.param; + +import com.gy.pgcm.sys.consts.dict.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/25 + */ +@ApiModel("宁波系统数据接口-合同查询参数") +@Data +public class NbContractQueryParam { + + /** + * 合同编号 + */ + @ApiModelProperty(value = "合同编号") + private String contractCode; + + /** + * 合同名称 + */ + @ApiModelProperty(value = "合同名称") + private String contractName; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceAccountParam.java b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceAccountParam.java new file mode 100644 index 0000000..6a5fced --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceAccountParam.java @@ -0,0 +1,55 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/26 + */ +@ApiModel("宁波系统数据接口-发票确认到账参数") +@Data +public class NbInvoiceAccountParam { + + /** + * 确认到账Id + */ + @ApiModelProperty(value = "确认到账Id 删除时必传") + private String accountId; + + /** + * 关联开票单号 + */ + @ApiModelProperty(value = "关联开票单号 新增时必传") + private String invoiceNo; + + /** + * 确认到账日期yyyy-MM-dd + */ + @ApiModelProperty(value = "确认到账日期yyyy-MM-dd 新增时必传") + private String accountDate; + + /** + * 确认到账金额 + */ + @ApiModelProperty(value = "确认到账金额 新增时必传") + private BigDecimal accountAmount; + + /** + * 操作标记 0 新增;1 删除 + */ + @ApiModelProperty(value = "操作标记 0 新增;1 删除 默认0") + private Integer opFlag; + + /** + * 操作员工编码 + */ + @ApiModelProperty(value = "操作员工编码", required = true) + private String opUserCode; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceConfirmParam.java b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceConfirmParam.java new file mode 100644 index 0000000..2d308e5 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceConfirmParam.java @@ -0,0 +1,37 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/26 + */ +@ApiModel("宁波系统数据接口-开票确认参数") +@Data +public class NbInvoiceConfirmParam { + + /** + * 开票单号 + */ + @ApiModelProperty(value = "开票单号", required = true) + private String invoiceNo; + + /** + * 开票确认日期yyyy-MM-dd + */ + @ApiModelProperty(value = "开票确认日期yyyy-MM-dd", required = true) + private String confirmDate; + + /** + * 确认员工编码 + */ + @ApiModelProperty(value = "确认员工编码", required = true) + private String confirmUserCode; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceIncomeParam.java b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceIncomeParam.java new file mode 100644 index 0000000..da4dd22 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceIncomeParam.java @@ -0,0 +1,57 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/26 + */ +@ApiModel("宁波系统数据接口-发票确认收入参数") +@Data +public class NbInvoiceIncomeParam { + + /** + * 确认收入Id + */ + @ApiModelProperty(value = "确认收入Id 删除时必传") + private String incomeId; + + /** + * 关联开票单号 + */ + @ApiModelProperty(value = "关联开票单号 新增时必传") + private String invoiceNo; + + /** + * 确认收入日期yyyy-MM-dd + */ + @ApiModelProperty(value = "确认收入日期yyyy-MM-dd 新增时必传") + private String incomeDate; + + /** + * 确认收入金额 + */ + @ApiModelProperty(value = "确认收入金额 新增时必传") + private BigDecimal incomeAmount; + + /** + * 操作标记 0 新增;1 删除 + */ + @ApiModelProperty(value = "操作标记 0 新增;1 删除 默认0") + private Integer opFlag; + + /** + * 操作员工编码 + */ + @ApiModelProperty(value = "操作员工编码", required = true) + private String opUserCode; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceParam.java b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceParam.java new file mode 100644 index 0000000..e481f69 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceParam.java @@ -0,0 +1,115 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/26 + */ +@ApiModel("宁波系统数据接口-开票信息参数") +@Data +public class NbInvoiceParam { + + /** + * 申请单号 + */ + @ApiModelProperty(value = "申请单号, 新增时传空,修改时必传") + private String invoiceNo; + + /** + * 开票日期yyyy-MM-dd + */ + @ApiModelProperty(value = "开票日期yyyy-MM-dd", required = true) + private String invoiceDate; + + /** + * 项目Id + */ + @ApiModelProperty(value = "项目编号 开票申请时必传") + private String projectNo; + + /** + * 合同收款进度 + */ + @ApiModelProperty(value = "合同收款进度") + private String receiptScheduleName; + + /** + * 付款方名称 + */ + @ApiModelProperty(value = "付款方名称 开票申请时必传") + private String payerName; + + /** + * 纳税人识别号 + */ + @ApiModelProperty(value = "纳税人识别号 开票申请时必传") + private String payerNumber; + + /** + * 开票金额 + */ + @ApiModelProperty(value = "开票金额", required = true) + private BigDecimal invoiceAmount; + + /** + * 开票内容 + */ + @ApiModelProperty(value = "开票内容 字典(开票内容) 开票申请时必传") + private String invoiceContent; + + /** + * 付款方式 + */ + @ApiModelProperty(value = "付款方式 字典(付款方式) 开票申请时必传") + private String paymentMode; + + /** + * 发票类型 + */ + @ApiModelProperty(value = "发票类型 字典(发票类型) 开票申请时必传") + private String invoiceType; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注 退票时必传") + private String remarkInfo; + + /** + * 特殊说明 + */ + @ApiModelProperty(value = "特殊说明") + private String specialInfo; + + /** + * 证明文件Id + */ + @ApiModelProperty(value = "证明文件Id 多个用逗号分割") + private String evidenceId; + + /** + * 是否退票 1 是;0 否 + */ + @ApiModelProperty(value = "是否退票 1 是;0 否", required = true) + private Integer isReturn; + + /** + * 退票原始单号 退票时必填 + */ + @ApiModelProperty(value = "退票原始单号 退票时必填") + private String returnInvoiceNo; + + /** + * 申请员工编号 + */ + @ApiModelProperty(value = "申请员工编号", required = true) + private String applyUserCode; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceStatusResult.java b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceStatusResult.java new file mode 100644 index 0000000..75a393f --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbInvoiceStatusResult.java @@ -0,0 +1,44 @@ +package com.gy.pgcm.nb.model.param; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/26 + */ +@ApiModel("宁波系统数据接口-开票状态返回结果") +@Data +public class NbInvoiceStatusResult { + + /** + * 申请单号 + */ + @ApiModelProperty(value = "申请单号") + private String invoiceNo; + + /** + * 状态 0 未提交, 1 审批中, 2 已通过(未确认), 3 已驳回, 4 已确认, 5 已退回, 6 已撤回 + */ + @ApiModelProperty(value = "状态 0 未提交, 1 审批中, 2 已通过(未确认), 3 已驳回, 4 已确认, 5 已退回, 6 已撤回") + private Integer status; + + /** + * 审批信息 + */ + @ApiModelProperty(value = "审批信息") + private String approveMsg; + + /** + * 审批记录 + */ + @ApiModelProperty(value = "审批记录") + private ListTODO
+ * + * @author zg + * @since 2023/12/25 + */ +@ApiModel("宁波系统数据接口-项目参数") +@Data +public class NbProjectParam { + + /** + * 项目编号 + */ + @ApiModelProperty(value = "项目编号 新增项目时传空;修改时必传") + private String projectNo; + + /** + * 项目名称 + */ + @ApiModelProperty(value = "项目名称", required = true) + private String projectName; + + /** + * 项目类型 + */ + @ApiModelProperty(value = "项目类型("+ Dict.PROJECT_TYPE +")", required = true) + private String projectType; + + /** + * 所属区域 + */ + @ApiModelProperty(value = "所属区域("+ Dict.AREA +")", required = true) + private String areaCode; + + /** + * 是否涉密->客户类别 + */ + @ApiModelProperty(value = "客户类别(ProjectSecretEnum)", required = true) + private Integer projectSecret; + + /** + * 销售负责人 + */ + @ApiModelProperty(value = "销售负责人员工编号", required = true) + private String salesLeaderCode; + + /** + * 名义总监 + */ + @ApiModelProperty(value = "名义总监员工编号") + private String nominalDirectorCode; + + /** + * 项目实施部门 + */ + @ApiModelProperty(value = "项目实施部门编码", required = true) + private String deptCode; + + /** + * 实施负责人 + */ + @ApiModelProperty(value = "实施负责人员工编号", required = true) + private String projectManagerCode; + + /** + * 项目金额 + */ + @ApiModelProperty(value = "项目金额", required = true) + private BigDecimal contractAmount; + + /** + * 投资金额(万元) + */ + @ApiModelProperty(value = "投资金额(万元)") + private BigDecimal projectConstructionScale; + + /** + * 甲方单位名称 + */ + @ApiModelProperty(value = "甲方单位名称") + private String projectCompany; + + /** + * 项目起始时间 + */ + @ApiModelProperty(value = "项目起始时间 yyyy-MM-dd", required = true) + private String projectStartDate; + + /** + * 项目截止时间 + */ + @ApiModelProperty(value = "项目截止时间 yyyy-MM-dd", required = true) + private String projectEndDate; + + /** + * 是否直接实施 + */ + @ApiModelProperty(value = "是否直接实施 0 否; 1 是 默认0") + private Integer directImplementation = 1; + + /** + * 项目所属类型 + */ + @ApiModelProperty(value = "项目所属类型", required = true) + private String projectCaseType; + + /** + * 项目所属行业 + */ + @ApiModelProperty(value = "项目所属行业", required = true) + private String projectIndustry; + + /** + * 所属用户类型 + */ + @ApiModelProperty(value = "所属用户类型", required = true) + private String projectUserProperty; + + /** + * 项目描述 + */ + @ApiModelProperty(value = "项目描述") + private String projectDescription; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remarks; + + /** + * 项目状态(0 商务、 1 未启动、 2 实施中、 3 验收中、 4 已验收、 9 申请结项、 10 已结项、 11 已关闭) + */ + @ApiModelProperty(value = "项目状态(0 商务、 1 未启动、 2 实施中、 3 验收中、 4 已验收、 9 申请结项、 10 已结项、 11 已关闭) 查询项目信息时使用") + private Integer projectStatus; + +} diff --git a/src/main/java/com/gy/pgcm/nb/model/param/NbProjectQueryParam.java b/src/main/java/com/gy/pgcm/nb/model/param/NbProjectQueryParam.java new file mode 100644 index 0000000..a49e0f8 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/model/param/NbProjectQueryParam.java @@ -0,0 +1,32 @@ +package com.gy.pgcm.nb.model.param; + +import com.gy.pgcm.sys.consts.dict.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/25 + */ +@ApiModel("宁波系统数据接口-项目查询参数") +@Data +public class NbProjectQueryParam { + + /** + * 项目编号 + */ + @ApiModelProperty(value = "项目编号") + private String projectNo; + + /** + * 项目名称 + */ + @ApiModelProperty(value = "项目名称") + private String projectName; + +} diff --git a/src/main/java/com/gy/pgcm/nb/service/INbService.java b/src/main/java/com/gy/pgcm/nb/service/INbService.java new file mode 100644 index 0000000..f3080a3 --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/service/INbService.java @@ -0,0 +1,107 @@ +package com.gy.pgcm.nb.service; + +import com.gy.pgcm.nb.model.param.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/25 + */ +public interface INbService { + + /** + * 同步项目信息 + * @param param + * @return + */ + NbProjectParam project(NbProjectParam param); + + /** + * 同步合同信息 + * @param param + * @return + */ + NbContractParam contract(NbContractParam param); + + /** + * + * @param param + * @return + */ + NbInvoiceParam invoice(NbInvoiceParam param); + + /** + * + * @param invoiceNo + * @return + */ + NbInvoiceStatusResult invoiceDelete(String invoiceNo); + + /** + * + * @param file + * @return + */ + String uploadEvidence(MultipartFile file); + + /** + * 开票确认 + * @param param + * @return + */ + NbInvoiceConfirmParam invoiceConfirm(NbInvoiceConfirmParam param); + + /** + * 同步开票确认收入信息 + * @param param + * @return + */ + NbInvoiceIncomeParam invoiceIncome(NbInvoiceIncomeParam param); + + /** + * 同步开票确认到账信息 + * @param param + * @return + */ + NbInvoiceAccountParam invoiceAccount(NbInvoiceAccountParam param); + + /** + * 获取开票信息审批信息 + * @param invoiceNo + * @return + */ + NbInvoiceStatusResult invoiceStatus(String invoiceNo); + + /** + * 获取开票申请单文件 + * @param invoiceNo + * @param response + */ + void invoiceForm(String invoiceNo, HttpServletResponse response); + + /** + * 获取项目信息 + * @param param + * @return + */ + NbProjectParam getProject(NbProjectQueryParam param); + + /** + * 获取合同信息 + * @param param + * @return + */ + NbContractParam getContract(NbContractQueryParam param); + + /** + * 调整项目状态 + * @param status + * @param projectNo + * @return + */ + Boolean changeProject(String status, String projectNo); +} diff --git a/src/main/java/com/gy/pgcm/nb/service/impl/NbServiceImpl.java b/src/main/java/com/gy/pgcm/nb/service/impl/NbServiceImpl.java new file mode 100644 index 0000000..f73f55c --- /dev/null +++ b/src/main/java/com/gy/pgcm/nb/service/impl/NbServiceImpl.java @@ -0,0 +1,1205 @@ +package com.gy.pgcm.nb.service.impl; + +import cn.bespinglobal.amg.common.exception.ClientException; +import cn.bespinglobal.amg.common.exception.ServerException; +import cn.bespinglobal.amg.common.tool.JSONTool; +import cn.bespinglobal.amg.common.util.DateUtil; +import cn.bespinglobal.amg.common.util.UserContextHolder; +import cn.bespinglobal.amg.flowable.process.idm.Group; +import cn.bespinglobal.amg.flowable.process.idm.User; +import cn.bespinglobal.amg.tool.poi.word.DocxBuilder; +import cn.bespinglobal.amg.tool.storage.pojo.SObject; +import com.gy.pgcm.biz.enums.BizContractTypeEnum; +import com.gy.pgcm.biz.mapper.BizContractMapper; +import com.gy.pgcm.biz.model.entity.BizContractDO; +import com.gy.pgcm.biz.service.IBizContractService; +import com.gy.pgcm.common.constant.ProjectTypeConst; +import com.gy.pgcm.common.enums.*; +import com.gy.pgcm.common.mapper.ProjectInfoMapper; +import com.gy.pgcm.common.model.entity.ProjectInfoDO; +import com.gy.pgcm.common.service.FileService; +import com.gy.pgcm.fin.common.FinCodeType; +import com.gy.pgcm.fin.entity.*; +import com.gy.pgcm.fin.entity.extend.FinInvoiceInfoExtendDO; +import com.gy.pgcm.fin.enums.FinEnumInvoiceStatus; +import com.gy.pgcm.fin.mapper.*; +import com.gy.pgcm.fin.service.IFinInvoiceService; +import com.gy.pgcm.fin.vo.param.FinInvoiceReturnParam; +import com.gy.pgcm.fin.vo.param.FinInvoiceUpdateParam; +import com.gy.pgcm.hr.mapper.HrOrgMapper; +import com.gy.pgcm.hr.mapper.HrStaffMapper; +import com.gy.pgcm.hr.model.entity.HrOrgDO; +import com.gy.pgcm.hr.model.vo.HrStaffVO; +import com.gy.pgcm.nb.enums.NbErrorCode; +import com.gy.pgcm.nb.enums.NbRecordTypeEnum; +import com.gy.pgcm.nb.mapper.NbLogMapper; +import com.gy.pgcm.nb.mapper.NbRecordMapper; +import com.gy.pgcm.nb.model.entity.NbLogDO; +import com.gy.pgcm.nb.model.entity.NbRecordDO; +import com.gy.pgcm.nb.model.param.*; +import com.gy.pgcm.nb.service.INbService; +import com.gy.pgcm.sale.service.ISaleProjectService; +import com.gy.pgcm.sys.consts.dict.Dict; +import com.gy.pgcm.sys.mapper.SysDictValMapper; +import com.gy.pgcm.sys.model.entity.SysDictValDO; +import com.gy.pgcm.sys.model.vo.ext.ProcessAssigneeTaskVO; +import com.gy.pgcm.sys.model.vo.ext.SysFileRes; +import com.gy.pgcm.sys.service.ISysFileService; +import com.gy.pgcm.sys.service.ISysProcessService; +import jodd.util.StringUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + *TODO
+ * + * @author zg + * @since 2023/12/25 + */ +@Slf4j +@Service +public class NbServiceImpl implements INbService { + + @Autowired + private NbRecordMapper recordMapper; + @Autowired + private NbLogMapper logMapper; + + @Autowired + private ProjectInfoMapper projectInfoMapper; + @Autowired + private BizContractMapper contractMapper; + @Autowired + private FinInvoiceMapper invoiceMapper; + @Autowired + private SysDictValMapper dictValMapper; + @Autowired + private HrOrgMapper orgMapper; + @Autowired + private HrStaffMapper staffMapper; + @Autowired + private FinCodeMapper finCodeMapper; + @Autowired + private FinInvoiceIncomeMapper invoiceIncomeMapper; + @Autowired + private FinInvoiceAccountMapper invoiceAccountMapper; + @Autowired + private FinReportBaseMapper finReportBaseMapper; + + @Autowired + private ISaleProjectService saleProjectService; + @Autowired + private IBizContractService contractService; + @Autowired + private IFinInvoiceService finInvoiceService; + @Autowired + private ISysProcessService sysProcessService; + @Autowired + private FileService fileService; + @Autowired + private FileService fileStorageService; + @Autowired + private ISysFileService sysFileService; + + private static final String LogTypeProject = "project"; + private static final String LogTypeProjectInfo = "projectInfo"; + private static final String LogTypeProjectChange = "projectChange"; + private static final String LogTypeContract = "contract"; + private static final String LogTypeContractInfo = "contractInfo"; + private static final String LogTypeInvoice = "invoice"; + private static final String LogTypeInvoiceDelete = "invoiceDelete"; + private static final String LogTypeInvoiceConfirm = "invoiceConfirm"; + private static final String LogTypeInvoiceIncome = "invoiceIncome"; + private static final String LogTypeInvoiceAccount = "invoiceAccount"; + private static final String LogTypeInvoiceStatus = "invoiceStatus"; + private static final String LogTypeInvoiceForm = "invoiceForm"; + + @Override + public NbProjectParam project(NbProjectParam param) { + try { + // 验证用户 + this.verifyCurrentUser(); + // 1. 验证参数 + ProjectInfoDO projectDO; + boolean isUpd = false; + // 1.2 验证项目编号 + if (!StringUtil.isEmpty(param.getProjectNo())) { // 项目编号存在、更新项目 + projectDO = this.projectInfoMapper.getByProjectNo(param.getProjectNo()); + if (null == projectDO) { + throw new ClientException("项目编号不存在", NbErrorCode.INVALID_PARAM); + } + // 验证项目来源 + if (null == this.recordMapper.findByKey(NbRecordTypeEnum.Type_Project.getValue(), param.getProjectNo())) { + throw new ClientException("该项目无修改权限", NbErrorCode.INVALID_PARAM); + } + isUpd = true; + } else { + projectDO = new ProjectInfoDO(); + } + // 1.3 验证项目名称名称 + if (StringUtil.isEmpty(param.getProjectName())) { + throw new ClientException("项目名称不能为空", NbErrorCode.INVALID_PARAM); + } + if (null != this.projectInfoMapper.findProjectByProjectName(param.getProjectName(), projectDO.getId())) { + throw new ClientException("项目名称不能重复", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectName(param.getProjectName()); + // 1.4 验证项目类型 + if (!ProjectTypeConst.verify(param.getProjectType())) { + throw new ClientException("无效的项目类型", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectType(param.getProjectType()); + // 1.5 验证区域 + if (StringUtil.isEmpty(param.getAreaCode())) { + throw new ClientException("项目所属区域不能为空", NbErrorCode.INVALID_PARAM); + } + if (null == this.dictValMapper.getByDictCodeAndVal(Dict.AREA, param.getAreaCode())) { + throw new ClientException("所属区域编码不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setAreaId(param.getAreaCode()); + // 1.6 验证客户类别 + ProjectSecretEnum pse = ProjectSecretEnum.verify(param.getProjectSecret()); + if (null == pse) { + throw new ClientException("无效的客户类别", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectSecret(pse); + // 1.7 验证销售负责人 + if (StringUtil.isEmpty(param.getSalesLeaderCode())) { + throw new ClientException("销售负责人员工编号不能为空", NbErrorCode.INVALID_PARAM); + } + HrStaffVO staffVO = this.staffMapper.getByStaffCode(param.getSalesLeaderCode()); + if (null == staffVO) { + throw new ClientException("销售负责人员工编号不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setSalesLeaderId(staffVO.getId()); + projectDO.setBearDeptId(staffVO.getDeptId()); + // 1.8 验证名义总监 + if (StringUtil.isNotEmpty(param.getNominalDirectorCode())) { + staffVO = this.staffMapper.getByStaffCode(param.getNominalDirectorCode()); + if (null == staffVO) { + throw new ClientException("名义总监员工编号不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setNominalDirectorId(staffVO.getId()); + } + // 1.9 验证项目实施部门 + HrOrgDO orgDO = this.orgMapper.getDeptByCode(param.getDeptCode()); + if (null == orgDO) { + throw new ClientException("项目实施部门编码不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setDeptId(orgDO.getId()); + // 1.10 验证实施负责人 + if (StringUtil.isEmpty(param.getProjectManagerCode())) { + throw new ClientException("实施负责人员工编号不能为空", NbErrorCode.INVALID_PARAM); + } + staffVO = this.staffMapper.getByStaffCode(param.getProjectManagerCode()); + if (null == staffVO) { + throw new ClientException("实施负责人员工编号不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectManagerId(staffVO.getId()); + // 1.11 验证项目金额 + if (null == param.getContractAmount() || param.getContractAmount().compareTo(BigDecimal.ZERO) < 0) { + throw new ClientException("无效的项目金额(金额大于等于0)", NbErrorCode.INVALID_PARAM); + } + projectDO.setContractAmount(param.getContractAmount()); + // 1.12 验证起始、截止时间 + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + if (!DateUtil.isValidDate(param.getProjectStartDate(), DateUtil.Format_YMD) || + !DateUtil.isValidDate(param.getProjectEndDate(), DateUtil.Format_YMD)) { + throw new ClientException("无效的项目起止时间,必传且格式yyyy-MM-dd", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectStartDate(LocalDate.parse(param.getProjectStartDate(), df)); + projectDO.setProjectEndDate(LocalDate.parse(param.getProjectEndDate(), df)); + // 1.13 是否直接实施 + if (null == param.getDirectImplementation() || 1 != param.getDirectImplementation()) + param.setDirectImplementation(0); + projectDO.setDirectImplementation(1 == param.getDirectImplementation()); + // 1.14 验证项目所属类型 + if (StringUtil.isEmpty(param.getProjectCaseType())) { + throw new ClientException("项目所属类型不能为空", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectCaseType(param.getProjectCaseType()); + // 1.15 验证项目所属行业 + if (StringUtil.isEmpty(param.getProjectIndustry())) { + throw new ClientException("项目所属行业不能为空", NbErrorCode.INVALID_PARAM); + } + if (null == this.dictValMapper.getByDictCodeAndName(Dict.Project_Industry, param.getProjectIndustry())) { + throw new ClientException("项目所属行业不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectIndustry(param.getProjectIndustry()); + // 1.16 验证所属用户类型 + if (StringUtil.isEmpty(param.getProjectUserProperty())) { + throw new ClientException("所属用户类型不能为空", NbErrorCode.INVALID_PARAM); + } + if (null == this.dictValMapper.getByDictCodeAndName(Dict.Project_User_Property, param.getProjectUserProperty())) { + throw new ClientException("所属用户类型不存在", NbErrorCode.INVALID_PARAM); + } + projectDO.setProjectUserProperty(param.getProjectUserProperty()); + projectDO.setProjectConstructionScale(param.getProjectConstructionScale()); + projectDO.setProjectCompany(param.getProjectCompany()); + projectDO.setProjectDescription(param.getProjectDescription()); + projectDO.setRemarks(param.getRemarks()); + // 2. + if (isUpd) { + // 2.1 修改项目信息 + this.projectInfoMapper.updateById(projectDO); + this.saveExecLog(LogTypeProject, true, param, projectDO, "success"); + // 2.2 更新关联销售合同信息 + BizContractDO contractDO = this.contractMapper.getSaleContractByProjectId(projectDO.getId()); + if (null != contractDO) { + contractDO.setAmount(projectDO.getContractAmount()); + contractDO.setProjectStartDate(projectDO.getProjectStartDate()); + contractDO.setProjectEndDate(projectDO.getProjectEndDate()); + contractDO.setAreaId(projectDO.getAreaId()); + contractDO.setSalesLeaderId(projectDO.getSalesLeaderId()); + contractDO.setCompanyName(projectDO.getProjectCompany()); + contractDO.setDeptId(projectDO.getBearDeptId()); + this.contractMapper.updateById(contractDO); + } + } else { + // 2.1 新增项目 + projectDO.setProjectNo(saleProjectService.generateFormalProjectNo(param.getAreaCode())); + projectDO.setProjectStatus(ProjectStatusEnum.NOT_INITIATED); + this.projectInfoMapper.insert(projectDO); + this.saveExecLog(LogTypeProject, true, param, projectDO, "success"); + // 2.2 添加记录 + this.saveExecRecord(NbRecordTypeEnum.Type_Project, projectDO.getProjectNo()); + + param.setProjectNo(projectDO.getProjectNo()); + } + return param; + } catch (Exception e) { + this.saveExecLog(LogTypeProject, false, param, null, e.getMessage()); + throw e; + } + } + + @Override + public NbContractParam contract(NbContractParam param) { + try { + // 验证用户 + this.verifyCurrentUser(); + // 1. 验证参数 + BizContractDO contractDO; + boolean isUpd = false; + // 1.2 验证合同编号 + if (!StringUtil.isEmpty(param.getContractCode())) { // 合同编号存在,更新合同信息 + contractDO = this.contractMapper.getSaleContractByCode(param.getContractCode()); + if (null == contractDO) { + throw new ClientException("销售合同编号不存在", NbErrorCode.INVALID_PARAM); + } + isUpd = true; + } else { + contractDO = new BizContractDO(); + } + // 1.3 验证合同名称 + if (StringUtil.isEmpty(param.getContractName())) { + throw new ClientException("合同名称不能为空", NbErrorCode.INVALID_PARAM); + } + contractDO.setName(param.getContractName()); + // 1.4 项目编号 + if (StringUtil.isEmpty(param.getProjectNo())) { + throw new ClientException("项目编号不能为空", NbErrorCode.INVALID_PARAM); + } + // 验证项目是否存在 + ProjectInfoDO projectInfoDO = this.projectInfoMapper.getByProjectNo(param.getProjectNo()); + if (null == projectInfoDO) { + throw new ClientException("项目不存在", NbErrorCode.INVALID_PARAM); + } + // 验证项目来源 + if (null == this.recordMapper.findByKey(NbRecordTypeEnum.Type_Project.getValue(), param.getProjectNo())) { + throw new ClientException("该项目无权限", NbErrorCode.INVALID_PARAM); + } + // 验证合同与项目是否匹配 + if (isUpd && !projectInfoDO.getId().equals(contractDO.getProjectId())) { + throw new ClientException("无法修改合同关联的项目编号", NbErrorCode.INVALID_PARAM); + } + // 验证项目是否已存在合同 + if (!isUpd && null != this.contractMapper.getSaleContractByProjectId(projectInfoDO.getId())) { + throw new ClientException("项目已存在销售合同,无法添加", NbErrorCode.INVALID_PARAM); + } + contractDO.setProjectId(projectInfoDO.getId()); + // 1.5 验证合同金额 + if (null != param.getContractAmount() && projectInfoDO.getContractAmount().compareTo(param.getContractAmount()) != 0) { + throw new ClientException("合同金额无效(应与项目金额一致)", NbErrorCode.INVALID_PARAM); + } + contractDO.setAmount(projectInfoDO.getContractAmount()); + // 1.6 是否高新 + contractDO.setHighTech(null != param.getHighTech() && 1 == param.getHighTech()); + // 1.7 验证中标方式 + if (StringUtil.isEmpty(param.getWinningBidWay())) { + throw new ClientException("中标方式不能为空", NbErrorCode.INVALID_PARAM); + } + SysDictValDO dictValDO = this.dictValMapper.getByDictCodeAndName(Dict.WINNING_BID_WAY, param.getWinningBidWay()); + if (null == dictValDO) { + throw new ClientException("中标方式不存在", NbErrorCode.INVALID_PARAM); + } + contractDO.setWinningBidWay(dictValDO.getValue()); + // 1.8 签入、签出 + contractDO.setSignIn(null != param.getSignIn() && 1 == param.getSignIn()); + contractDO.setSignOut(null != param.getSignOut() && 1 == param.getSignOut()); + // 1.9 验证确认日期 + if (StringUtil.isNotEmpty(param.getConfirmDate()) && !DateUtil.isValidDate(param.getConfirmDate(), DateUtil.Format_YMD)) { + throw new ClientException("确认日期格式错误 (yyyy-MM-dd)", NbErrorCode.INVALID_PARAM); + } + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + if (StringUtil.isNotEmpty(param.getConfirmDate())) { + contractDO.setConfirmDate(LocalDate.parse(param.getConfirmDate(), df)); + } + // 2. + if (isUpd) { // 修改 + this.contractMapper.updateById(contractDO); + this.saveExecLog(LogTypeContract, true, param, contractDO, "success"); + } else { + // 2.1 新增合同 + contractDO.setType(BizContractTypeEnum.SALE); + contractDO.setProjectStartDate(projectInfoDO.getProjectStartDate()); + contractDO.setProjectEndDate(projectInfoDO.getProjectEndDate()); + contractDO.setAreaId(projectInfoDO.getAreaId()); + contractDO.setSalesLeaderId(projectInfoDO.getSalesLeaderId()); + contractDO.setCompanyName(projectInfoDO.getProjectCompany()); + contractDO.setState(CheckStateEnum.APPROVED); + contractDO.setDeptId(projectInfoDO.getBearDeptId()); + contractDO.setCode(this.contractService.generateContractCode(contractDO.getAreaId(), BizContractTypeEnum.SALE)); + this.contractMapper.insert(contractDO); + this.saveExecLog(LogTypeContract, true, param, contractDO, "success"); + // 2.2 添加记录 + this.saveExecRecord(NbRecordTypeEnum.Type_Contract, contractDO.getCode()); + + param.setContractCode(contractDO.getCode()); + } + return param; + } catch (Exception e) { + this.saveExecLog(LogTypeContract, false, param, null, e.getMessage()); + throw e; + } + } + + @Override + public NbInvoiceParam invoice(NbInvoiceParam param) { + if (null != param.getIsReturn() && 1 == param.getIsReturn()) { + // 退票申请 + return this.invoiceReturn(param); + } else { + // 开票申请 +// return this.invoiceApply(param); + return this.applyInvoice(param); + } + } + + /** + * 开票申请、修改 + * @param param + * @return + */ + private NbInvoiceParam applyInvoice(NbInvoiceParam param) { + try { + // 验证用户 + this.verifyCurrentUser(); + // 1. 验证参数 + FinInvoiceUpdateParam updateParam = new FinInvoiceUpdateParam(); + String invoiceId = null; + boolean isUpd = false; + // 1.2 验证申请单号 + if (!StringUtil.isEmpty(param.getInvoiceNo())) { // 申请单号存在,更新开票信息 + FinInvoiceDO existInvoiceDO = this.invoiceMapper.getInvoiceByNo(param.getInvoiceNo()); + if (null == existInvoiceDO) { + throw new ClientException("开票申请单不存在", NbErrorCode.INVALID_PARAM); + } + invoiceId = existInvoiceDO.getId(); + // 验证开票来源 + if (null == this.recordMapper.findByKey(NbRecordTypeEnum.Type_Invoice.getValue(), param.getInvoiceNo())) { + throw new ClientException("该开票申请单无修改权限", NbErrorCode.INVALID_PARAM); + } + isUpd = true; + } + // 1.3 验证开票日期 + if (!DateUtil.isValidDate(param.getInvoiceDate(), DateUtil.Format_YMD)) { + throw new ClientException("无效的开票日期,必传且格式yyyy-MM-dd", NbErrorCode.INVALID_PARAM); + } + updateParam.setInvoiceDate(param.getInvoiceDate()); + // 1.4 项目编号 + if (StringUtil.isEmpty(param.getProjectNo())) { + throw new ClientException("项目编号不能为空", NbErrorCode.INVALID_PARAM); + } + // 验证项目是否存在 + ProjectInfoDO projectInfoDO = this.projectInfoMapper.getByProjectNo(param.getProjectNo()); + if (null == projectInfoDO) { + throw new ClientException("项目不存在", NbErrorCode.INVALID_PARAM); + } + // 项目项目状态 + if (projectInfoDO.getProjectStatus() == ProjectStatusEnum.CLOSED) { + throw new ClientException("项目已关闭", NbErrorCode.INVALID_PARAM); + } + // 验证项目来源 + if (null == this.recordMapper.findByKey(NbRecordTypeEnum.Type_Project.getValue(), param.getProjectNo())) { + throw new ClientException("该项目无权限", NbErrorCode.INVALID_PARAM); + } + // 验证合同 + BizContractDO contractDO = this.contractMapper.getSaleContractByProjectId(projectInfoDO.getId()); + if (null == contractDO || contractDO.getState() != CheckStateEnum.APPROVED) { + throw new ClientException("该项目无合同信息或合同状态无效", NbErrorCode.INVALID_PARAM); + } + updateParam.setProjectId(projectInfoDO.getId()); + // 1.5 验证付款方名称 + if (StringUtil.isEmpty(param.getPayerName())) { + throw new ClientException("付款方名称不能为空", NbErrorCode.INVALID_PARAM); + } + updateParam.setPayerName(param.getPayerName()); + // 1.6 验证纳税人识别号 + if (StringUtil.isEmpty(param.getPayerNumber())) { + throw new ClientException("纳税人识别号不能为空", NbErrorCode.INVALID_PARAM); + } + updateParam.setPayerNumber(param.getPayerNumber()); + // 1.7 验证开票金额 + if (null == param.getInvoiceAmount() || param.getInvoiceAmount().compareTo(BigDecimal.ZERO) == 0) { + throw new ClientException("无效的开票金额", NbErrorCode.INVALID_PARAM); + } + updateParam.setInvoiceAmount(param.getInvoiceAmount()); + // 1.8 验证开票内容 + FinCodeDO invContentDO = this.finCodeMapper.findByTypeAndName(FinCodeType.TYPE_INVOICE_INFO, param.getInvoiceContent()); + if (null == invContentDO) { + throw new ClientException("无效的开票内容", NbErrorCode.INVALID_PARAM); + } + updateParam.setInvoiceContent(invContentDO.getId()); + // 1.9 验证付款方式 + FinCodeDO invModeDO = this.finCodeMapper.findByTypeAndName(FinCodeType.TYPE_PAYMENT_TYPE, param.getPaymentMode()); + if (null == invModeDO) { + throw new ClientException("无效的付款方式", NbErrorCode.INVALID_PARAM); + } + updateParam.setPaymentMode(invModeDO.getId()); + // 1.10 验证发票类型 + FinCodeDO invTypeDO = this.finCodeMapper.findByTypeAndName(FinCodeType.TYPE_INVOICE_TYPE, param.getInvoiceType()); + if (null == invTypeDO) { + throw new ClientException("无效的发票类型", NbErrorCode.INVALID_PARAM); + } + updateParam.setInvoiceType(invTypeDO.getId()); + // 1.11 验证申请员工编号 + if (StringUtil.isEmpty(param.getApplyUserCode())) { + throw new ClientException("申请员工编号不能为空", NbErrorCode.INVALID_PARAM); + } + HrStaffVO staffVO = this.staffMapper.getByStaffCode(param.getApplyUserCode()); + if (null == staffVO) { + throw new ClientException("申请员工编号不存在", NbErrorCode.INVALID_PARAM); + } + // 验证开票权限 + if (!staffVO.getId().equals(projectInfoDO.getSalesLeaderId()) && !staffVO.getId().equals(projectInfoDO.getProjectManagerId())) { + throw new ClientException("申请员工无项目的开票权限(需要项目的销售人员或实施负责人)", NbErrorCode.INVALID_PARAM); + } + // 1.12 验证证明文件 + int evidenceFlag = 0; // 是否有证明文件0无1有 + ListTODO
+ * + * @author zg + * @since 2023/12/25 + */ +@Api(tags = "宁波系统数据对接接口") +@RestController +@RequestMapping("/api/nb") +public class NbController { + + @Autowired + private INbService nbService; + + @PassAuth + @ApiOperation(value = "同步项目信息", notes = "同步项目信息", produces = "application/json") + @PostMapping("/project") + public Response