From b1e7f9a9f676911105a52c7c5cf5ff62c57b68b9 Mon Sep 17 00:00:00 2001
From: furongxin <419481438@qq.com>
Date: Sun, 8 Dec 2024 13:36:06 +0800
Subject: [PATCH] =?UTF-8?q?feat(bpm):=20=E6=96=B0=E5=A2=9E=E5=90=88?=
=?UTF-8?q?=E5=90=8C=E5=AE=A1=E6=89=B9=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加合同审批相关的 API 接口和实现类
- 创建合同审批的请求和响应对象
- 实现合同审批的创建、查询等功能
- 添加合同统计相关接口和实现
- 优化合同审批页面列表展示
---
yudao-module-bpm/yudao-module-bpm-api/pom.xml | 4 +
.../module/bpm/api/oa/BpmOAContractApi.java | 43 +++
.../module/bpm/api/oa/BpmOAEntryApi.java | 2 +-
.../module/bpm/api/oa/BpmOAInvoiceApi.java | 21 ++
.../module/bpm/api/oa/BpmOALeaveApi.java | 2 +-
.../module/bpm/api/oa/BpmOARefundApi.java | 2 +-
.../api/oa/vo/contract/BpmOAContractDTO.java | 97 +++++
.../api/oa/vo/contract/BpmOAContractVO.java | 30 ++
.../oa/vo/contract/ContractStatisticsDTO.java | 38 ++
.../api/oa/vo/{ => entry}/BpmOAEntryDTO.java | 2 +-
.../vo/{ => evection}/BpmOAEvectionDTO.java | 2 +-
.../api/oa/vo/invoice/BpmOAInvoiceDTO.java | 88 +++++
.../oa/vo/{ => leave}/BpmOALeaveRpcVO.java | 2 +-
.../oa/vo/{ => refund}/BpmOARefundDTO.java | 2 +-
.../module/bpm/enums/ErrorCodeConstants.java | 2 +-
yudao-module-bpm/yudao-module-bpm-biz/pom.xml | 16 +
.../bpm/api/oa/BpmOAContractApiImpl.java | 55 +++
.../module/bpm/api/oa/BpmOAEntryApiImpl.java | 2 +-
.../bpm/api/oa/BpmOAInvoiceApiImpl.java | 32 ++
.../module/bpm/api/oa/BpmOALeaveApiImpl.java | 2 +-
.../module/bpm/api/oa/BpmOARefundApiImpl.java | 2 +-
.../admin/oa/BpmOAContractController.java | 90 ++++-
.../admin/oa/BpmOAInvoiceController.java | 9 +
.../vo/contract/BpmOAContractCreateReqVO.java | 169 +++------
.../vo/contract/BpmOAContractPageReqVO.java | 43 +++
.../oa/vo/contract/BpmOAContractRespVO.java | 81 +++-
.../vo/contract/ContractStatisticsRespVO.java | 38 ++
.../oa/vo/contract/CrmContractProductVO.java | 38 ++
.../vo/invoice/BpmOAInvoiceCreateReqVO.java | 46 ++-
.../oa/vo/invoice/BpmOAInvoicePageReqVO.java | 31 ++
.../oa/vo/invoice/BpmOAInvoiceRespVO.java | 46 ++-
.../admin/task/BpmTaskController.java | 54 ++-
.../task/vo/task/BpmCrmTaskPageReqVO.java | 20 +
.../dal/dataobject/oa/BpmOAContractDO.java | 85 ++++-
.../bpm/dal/dataobject/oa/BpmOAInvoiceDO.java | 58 ++-
.../bpm/dal/mysql/oa/BpmOAContractMapper.java | 56 +++
.../bpm/dal/mysql/oa/BpmOAInvoiceMapper.java | 52 +++
.../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 2 +-
.../bpm/dal/mysql/task/BpmTaskExtMapper.java | 14 +
.../rpc/config/RpcConfiguration.java | 8 +-
.../bpm/service/oa/BpmOAContractService.java | 68 +++-
.../service/oa/BpmOAContractServiceImpl.java | 351 ++++++++++++++++--
.../bpm/service/oa/BpmOAInvoiceService.java | 18 +
.../service/oa/BpmOAInvoiceServiceImpl.java | 97 ++++-
.../bpm/service/oa/BpmOALeaveService.java | 2 +-
.../bpm/service/oa/BpmOALeaveServiceImpl.java | 2 +-
.../listener/BpmOAContractResultListener.java | 2 +-
.../bpm/service/task/BpmTaskService.java | 8 +
.../bpm/service/task/BpmTaskServiceImpl.java | 6 +
.../mapper/oa/BpmOAContractMapper.xml | 65 ++++
.../resources/mapper/oa/BpmOALeaveMapper.xml | 2 +-
.../hrm/api/crmbusiness/BusinessApi.java | 23 ++
.../api/crmbusiness/dto/CrmBusinessDTO.java | 62 ++++
.../hrm/api/crmcontract/ContractApi.java | 31 ++
.../dto/CrmContractProductDTO.java | 38 ++
.../hrm/api/crmcustomer/CrmCustomerApi.java | 21 ++
.../api/crmcustomer/dto/CrmCustomerDTO.java | 113 ++++++
.../yudao-module-crm-biz/.flattened-pom.xml | 6 +
yudao-module-crm/yudao-module-crm-biz/pom.xml | 6 +
.../crm/api/crmbusiness/BusinessApiImpl.java | 31 ++
.../crm/api/crmcontract/ContractApiImpl.java | 40 ++
.../api/crmcustomer/CrmCustomerApiImpl.java | 31 ++
.../CrmAchievementController.java | 6 +-
.../admin/crmanalysis/CustomerController.java | 4 -
.../crmclues/vo/CrmCluesStatisticsRespVO.java | 18 +
.../vo/CustomerStatisticRespVO.java | 18 +
.../crmrecord/vo/RecordStatisticsRespVO.java | 24 ++
.../crmachievement/CrmAchievementMapper.java | 22 ++
.../dal/mysql/crmclues/CrmCluesMapper.java | 5 +
.../mysql/crmcontract/CrmContractMapper.java | 7 -
.../mysql/crmcustomer/CrmCustomerMapper.java | 5 +-
.../dal/mysql/crmrecord/CrmRecordMapper.java | 4 +
.../rpc/config/RpcConfiguration.java | 4 +-
.../crmachievement/CrmAchievementService.java | 4 +-
.../CrmAchievementServiceImpl.java | 271 ++++++++------
.../crmanalysis/AchievementServiceImpl.java | 111 +++---
.../service/crmanalysis/CustomerService.java | 12 +-
.../crmanalysis/CustomerServiceImpl.java | 128 ++++---
.../crm/service/crmclues/CrmCluesService.java | 8 +-
.../service/crmclues/CrmCluesServiceImpl.java | 6 +
.../crmcontract/CrmContractService.java | 13 +-
.../crmcontract/CrmContractServiceImpl.java | 6 +
.../crmcustomer/CrmCustomerService.java | 7 +
.../crmcustomer/CrmCustomerServiceImpl.java | 29 +-
.../CrmCustomerContactsService.java | 6 +-
.../CrmCustomerContactsServiceImpl.java | 1 -
.../service/crmindex/CrmIndexServiceImpl.java | 128 ++++---
.../crminvoice/CrmInvoiceServiceImpl.java | 22 +-
.../service/crmrecord/CrmRecordService.java | 10 +
.../crmrecord/CrmRecordServiceImpl.java | 7 +
.../mapper/crmclues/CrmCluesMapper.xml | 24 ++
.../mapper/crmcontract/CrmContractMapper.xml | 21 ++
.../mapper/crmcustomer/CrmCustomerMapper.xml | 24 ++
.../mapper/crmrecord/CrmRecordMapper.xml | 37 ++
.../api/storeproduct/StoreProductApi.java | 13 +-
.../StoreProductAttrValueApi.java | 8 +-
.../api/storeproduct/StoreProductApiImpl.java | 11 +-
.../StoreProductAttrValueApiImpl.java | 20 +-
.../StoreProductAttrValueMapper.java | 2 +-
.../storeproduct/StoreProductService.java | 8 +
.../storeproduct/StoreProductServiceImpl.java | 5 +
.../StoreProductAttrValueService.java | 8 +
.../StoreProductAttrValueServiceImpl.java | 5 +
.../src/main/resources/application-local.yaml | 6 +-
.../yudao/module/system/api/dept/DeptApi.java | 5 +
.../module/system/api/user/AdminUserApi.java | 11 +
.../api/user/dto/AdminUserPageApiDTO.java | 7 +-
.../module/system/api/dept/DeptApiImpl.java | 8 +
.../system/api/user/AdminUserApiImpl.java | 11 +
.../controller/admin/dept/DeptController.java | 27 ++
.../admin/rental/RentalOrderController.java | 2 +-
.../controller/admin/user/UserController.java | 7 +-
.../dal/mysql/user/AdminUserMapper.java | 5 +
.../system/job/fieldwork/FieldworkJob.java | 2 +-
.../system/service/dept/DeptService.java | 7 +
.../system/service/dept/DeptServiceImpl.java | 8 +
.../system/service/user/AdminUserService.java | 8 +
.../service/user/AdminUserServiceImpl.java | 13 +
.../resources/mapper/user/AdminUserMapper.xml | 26 ++
119 files changed, 3072 insertions(+), 562 deletions(-)
create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApi.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApi.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractDTO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractVO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/ContractStatisticsDTO.java
rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/{ => entry}/BpmOAEntryDTO.java (97%)
rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/{ => evection}/BpmOAEvectionDTO.java (97%)
create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/invoice/BpmOAInvoiceDTO.java
rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/{ => leave}/BpmOALeaveRpcVO.java (96%)
rename yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/{ => refund}/BpmOARefundDTO.java (96%)
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApiImpl.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApiImpl.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractPageReqVO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/ContractStatisticsRespVO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/CrmContractProductVO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoicePageReqVO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmCrmTaskPageReqVO.java
create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAContractMapper.xml
create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/hrm/api/crmbusiness/BusinessApi.java
create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/hrm/api/crmbusiness/dto/CrmBusinessDTO.java
create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/hrm/api/crmcontract/ContractApi.java
create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/hrm/api/crmcontract/dto/CrmContractProductDTO.java
create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/hrm/api/crmcustomer/CrmCustomerApi.java
create mode 100644 yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/hrm/api/crmcustomer/dto/CrmCustomerDTO.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/api/crmbusiness/BusinessApiImpl.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/api/crmcontract/ContractApiImpl.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/api/crmcustomer/CrmCustomerApiImpl.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmclues/vo/CrmCluesStatisticsRespVO.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmcustomer/vo/CustomerStatisticRespVO.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/RecordStatisticsRespVO.java
create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecord/CrmRecordMapper.xml
diff --git a/yudao-module-bpm/yudao-module-bpm-api/pom.xml b/yudao-module-bpm/yudao-module-bpm-api/pom.xml
index 470b4b53..06e83885 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/pom.xml
+++ b/yudao-module-bpm/yudao-module-bpm-api/pom.xml
@@ -42,6 +42,10 @@
spring-cloud-starter-openfeign
true
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-protection
+
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApi.java
new file mode 100644
index 00000000..9fce8b07
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApi.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.bpm.api.oa;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.contract.BpmOAContractDTO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.contract.BpmOAContractVO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.contract.ContractStatisticsDTO;
+import cn.iocoder.yudao.module.bpm.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
+@Tag(name = "RPC 服务 - 流程实例")
+public interface BpmOAContractApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/oa/contract";
+
+ @PostMapping(PREFIX + "/create")
+ @Operation(summary = "创建合同审批流程")
+ @Idempotent(timeout = 10)
+ CommonResult create(@RequestBody BpmOAContractDTO createReqVO);
+
+ @GetMapping(PREFIX + "/get-contract-count")
+ @Operation(summary = "获得当日合同统计 | 新增数量、新增金额")
+ CommonResult getContractCount(@RequestParam("relation") String relation);
+
+ @GetMapping(PREFIX + "/get-contract-statistics")
+ @Operation(summary = "获得指定用户的合同统计信息")
+ CommonResult> getContractStatistics(@RequestParam("userId") List userIds,
+ @RequestParam(name = "createTime", required = false) LocalDateTime[] createTime);
+
+ @PostMapping(PREFIX + "/getList")
+ @Operation(summary = "获得合同列表")
+ CommonResult> getContractList(@RequestBody BpmOAContractVO respVO);
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApi.java
index ce496609..8cfdcf77 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApi.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApi.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.bpm.api.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOAEntryDTO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.entry.BpmOAEntryDTO;
import cn.iocoder.yudao.module.bpm.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApi.java
new file mode 100644
index 00000000..34d92a00
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApi.java
@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.bpm.api.oa;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.invoice.BpmOAInvoiceDTO;
+import cn.iocoder.yudao.module.bpm.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
+@Tag(name = "RPC 服务 - 流程实例")
+public interface BpmOAInvoiceApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/oa/invoice";
+
+ @PostMapping(PREFIX + "/create")
+ @Operation(summary = "创建开票申请流程")
+ CommonResult create(@RequestBody BpmOAInvoiceDTO createReqVO);
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApi.java
index 7a679ae1..d7e167de 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApi.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApi.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.bpm.api.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOALeaveRpcVO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.leave.BpmOALeaveRpcVO;
import cn.iocoder.yudao.module.bpm.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApi.java
index a4246e9f..bccad797 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApi.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApi.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.bpm.api.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOARefundDTO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.refund.BpmOARefundDTO;
import cn.iocoder.yudao.module.bpm.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractDTO.java
new file mode 100644
index 00000000..02cf1d8c
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractDTO.java
@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.bpm.api.oa.vo.contract;
+
+import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
+/**
+ * 合同审批 创建 Request VO
+ *
+ * @author 符溶馨
+ */
+@Schema(description = "管理后台 - 合同审批创建 Request VO")
+@Data
+public class BpmOAContractDTO {
+
+ @Schema(description = "合同类型 | 字典值 bpm_oa_contract_type", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "合同类型不能为空")
+ private Integer contractType;
+
+ @Schema(description = "合同名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "合同名称不能为空")
+ private String contractName;
+
+ @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "合同编号不能为空")
+ private String contractNo;
+
+ @Schema(description = "签约日期", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "签约日期不能为空")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private LocalDate signingDate;
+
+ @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long customerId;
+
+ @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String customerName;
+
+ @Schema(description = "客户签约人(联系人ID)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long contactsId;
+
+ @Schema(description = "客户签约人(联系人)名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contactsName;
+
+ @Schema(description = "签约公司编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "签约公司不能为空")
+ private Long companyId;
+
+ @Schema(description = "签约人编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long signatoryId;
+
+ @Schema(description = "合同金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal contractMoney;
+
+ @Schema(description = "已收/已付金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal returnMoney;
+
+ @Schema(description = "已开票金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal invoiceMoney;
+
+ @Schema(description = "产品总金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal totalPrice;
+
+ @Schema(description = "整单优惠金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal discountRate;
+
+ @Schema(description = "商机ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long businessId;
+
+ @Schema(description = "合同开始时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private LocalDate startDate;
+
+ @Schema(description = "合同结束时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private LocalDate endDate;
+
+ @Schema(description = "合同状态 | 1已签约 2过期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Integer status;
+
+ @Schema(description = "流程实例编号")
+ private String processInstanceId;
+
+ @Schema(description = "状态-参见 bpm_process_instance_result 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer result;
+
+ @Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
+ private List fileItems;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractVO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractVO.java
new file mode 100644
index 00000000..642d672f
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/BpmOAContractVO.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.bpm.api.oa.vo.contract;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Schema(description = "BpmOA合同审批流程的VO对象")
+@Data
+public class BpmOAContractVO {
+
+ /**
+ * 合同类型
+ * 1 销售合同
+ */
+ public static final Integer SALE_CONTRACT = 1;
+
+ @Schema(description = "用户编号")
+ private List userId;
+
+ @Schema(description = "合同类型")
+ private Integer contractType;
+
+ @Schema(description = "开始时间")
+ private Date starTime;
+
+ @Schema(description = "结束时间")
+ private Date endTime;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/ContractStatisticsDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/ContractStatisticsDTO.java
new file mode 100644
index 00000000..fd3097bd
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/contract/ContractStatisticsDTO.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.bpm.api.oa.vo.contract;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 合同审批 请求Request VO")
+@Data
+public class ContractStatisticsDTO {
+
+ @Schema(description = "用户编号")
+ private Long userId;
+
+ @Schema(description = "今日新增合同数")
+ private Integer todayAdditions;
+
+ @Schema(description = "昨日新增合同数")
+ private Integer yesterdayAdditions;
+
+ @Schema(description = "较昨日百分比 | 数量")
+ private BigDecimal countPercentage;
+
+ @Schema(description = "今日新增合同金额")
+ private BigDecimal todayAddMoney;
+
+ @Schema(description = "昨日新增合同金额")
+ private BigDecimal yesterdayAddMoney;
+
+ @Schema(description = "较昨日百分比 | 金额")
+ private BigDecimal moneyPercentage;
+
+ @Schema(description = "合同总数")
+ private Integer count;
+
+ @Schema(description = "合同总金额")
+ private BigDecimal money;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOAEntryDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/entry/BpmOAEntryDTO.java
similarity index 97%
rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOAEntryDTO.java
rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/entry/BpmOAEntryDTO.java
index e6ac4839..dc00e571 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOAEntryDTO.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/entry/BpmOAEntryDTO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.api.oa.vo;
+package cn.iocoder.yudao.module.bpm.api.oa.vo.entry;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOAEvectionDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/evection/BpmOAEvectionDTO.java
similarity index 97%
rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOAEvectionDTO.java
rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/evection/BpmOAEvectionDTO.java
index 0b549f1a..89c3ff7d 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOAEvectionDTO.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/evection/BpmOAEvectionDTO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.api.oa.vo;
+package cn.iocoder.yudao.module.bpm.api.oa.vo.evection;
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/invoice/BpmOAInvoiceDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/invoice/BpmOAInvoiceDTO.java
new file mode 100644
index 00000000..fec366fd
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/invoice/BpmOAInvoiceDTO.java
@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.bpm.api.oa.vo.invoice;
+
+import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@Schema(description = "管理后台 - 开票申请创建 Request VO")
+@Data
+@EqualsAndHashCode()
+@ToString(callSuper = true)
+public class BpmOAInvoiceDTO {
+
+ @Schema(description = "计划开票日期", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "计划开票日期不能为空")
+ private LocalDate invoiceDate;
+
+ @Schema(description = "关联合同业务编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "合同编号不能为空")
+ private Long contractId;
+
+ @Schema(description = "关联合同流程实例编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contractInstanceId;
+
+ @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long customerId;
+
+ @Schema(description = "开票主体", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "开票主体不能为空")
+ private String invoiceBody;
+
+ @Schema(description = "发票抬头", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "发票抬头不能为空")
+ private String invoiceName;
+
+ @Schema(description = "抬头类型 | 1企业2个人3事业单位", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "抬头类型不能为空")
+ private Integer invoiceIssue;
+
+ @Schema(description = "发票类型 | 1普票 2专票", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "发票类型不能为空")
+ private Integer invoiceType;
+
+ @Schema(description = "统一社会信用代码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "统一社会信用代码不能为空")
+ private String registerNo;
+
+ @Schema(description = "开票金额", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "开票金额不能为空")
+ private BigDecimal amount;
+
+ @Schema(description = "开票内容", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "开票内容不能为空")
+ private String content;
+
+ @Schema(description = "开票单位地址")
+ private String unitAddress;
+
+ @Schema(description = "开票单位电话")
+ private String unitPhone;
+
+ @Schema(description = "开票单位开户银行")
+ private String unitBankName;
+
+ @Schema(description = "开票单位银行账号")
+ private String unitBankNo;
+
+ @Schema(description = "开票单位邮箱")
+ private String email;
+
+ @Schema(description = "开票状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Integer status;
+
+ @Schema(description = "流程实例编号")
+ private String processInstanceId;
+
+ @Schema(description = "状态-参见 bpm_process_instance_result 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer result;
+
+ @Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
+ private List fileItems ;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOALeaveRpcVO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/leave/BpmOALeaveRpcVO.java
similarity index 96%
rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOALeaveRpcVO.java
rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/leave/BpmOALeaveRpcVO.java
index 3779966a..f91485b2 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOALeaveRpcVO.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/leave/BpmOALeaveRpcVO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.api.oa.vo;
+package cn.iocoder.yudao.module.bpm.api.oa.vo.leave;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOARefundDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/refund/BpmOARefundDTO.java
similarity index 96%
rename from yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOARefundDTO.java
rename to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/refund/BpmOARefundDTO.java
index 443a8d5f..1db5c8a4 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/BpmOARefundDTO.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/vo/refund/BpmOARefundDTO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.api.oa.vo;
+package cn.iocoder.yudao.module.bpm.api.oa.vo.refund;
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
index 8775f08a..d2051942 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -59,7 +59,7 @@ public interface ErrorCodeConstants {
ErrorCode OA_REPLACEMENT_CARD_NOT_EXISTS = new ErrorCode(1_009_001_122, "补卡申请不存在");
ErrorCode OA_REFUND_NOT_EXISTS = new ErrorCode(1_009_001_123, "退款申请不存在");
ErrorCode OA_PROJECT_NOT_EXISTS = new ErrorCode(1_009_001_124, "项目申请不存在");
-
+ ErrorCode OA_CONTRACT_INVOICE_AMOUNT_LACK = new ErrorCode(1_009_001_125, "该合同的开票余额不足!");
// ========== 流程模型 1-009-002-000 ==========
ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "已经存在流程标识为【{}】的流程");
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/pom.xml b/yudao-module-bpm/yudao-module-bpm-biz/pom.xml
index 64054212..08c54964 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/pom.xml
+++ b/yudao-module-bpm/yudao-module-bpm-biz/pom.xml
@@ -118,6 +118,22 @@
cn.iocoder.cloud
yudao-spring-boot-starter-flowable
+
+ cn.iocoder.cloud
+ yudao-module-product-api
+ 2.0.0-jdk8-snapshot
+ compile
+
+
+ cn.iocoder.cloud
+ yudao-module-crm-api
+ 2.0.0-jdk8-snapshot
+ compile
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-protection
+
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApiImpl.java
new file mode 100644
index 00000000..b46c3eac
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAContractApiImpl.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.bpm.api.oa;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.contract.BpmOAContractDTO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.contract.BpmOAContractVO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.contract.ContractStatisticsDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.ContractStatisticsRespVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAContractDO;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAContractService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+/**
+ * Flowable 流程实例 Api 实现类
+ */
+@RestController
+@Validated
+public class BpmOAContractApiImpl implements BpmOAContractApi{
+
+ @Resource
+ private BpmOAContractService contractService;
+
+ @Override
+ public CommonResult create(BpmOAContractDTO createReqVO) {
+
+ return success(contractService.createContract(getLoginUserId(), BeanUtils.toBean(createReqVO, BpmOAContractCreateReqVO.class)));
+ }
+
+ @Override
+ public CommonResult getContractCount(String relation) {
+ ContractStatisticsRespVO respVO = contractService.getContractStatistics(getLoginUserId(), relation);
+ return success(BeanUtils.toBean(respVO, ContractStatisticsDTO.class));
+ }
+
+ @Override
+ public CommonResult> getContractStatistics(List userIds, LocalDateTime[] createTime) {
+ List respVOS = contractService.getContractStatisticsListByUserIds(userIds, createTime);
+ return success(BeanUtils.toBean(respVOS, ContractStatisticsDTO.class));
+ }
+
+ @Override
+ public CommonResult> getContractList(BpmOAContractVO respVO) {
+ List contractDO = contractService.getContractList(respVO);
+ return success(BeanUtils.toBean(contractDO, BpmOAContractDTO.class));
+ }
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApiImpl.java
index 989015b2..d168bc10 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApiImpl.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAEntryApiImpl.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.api.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOAEntryDTO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.entry.BpmOAEntryDTO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAEntryDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAEntryService;
import org.springframework.validation.annotation.Validated;
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApiImpl.java
new file mode 100644
index 00000000..f4da6fac
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOAInvoiceApiImpl.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.bpm.api.oa;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.invoice.BpmOAInvoiceDTO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.invoice.BpmOAInvoiceCreateReqVO;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAInvoiceService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+/**
+ * Flowable 流程实例 Api 实现类
+ */
+@RestController
+@Validated
+public class BpmOAInvoiceApiImpl implements BpmOAInvoiceApi{
+
+ @Resource
+ private BpmOAInvoiceService invoiceService;
+
+
+ @Override
+ public CommonResult create(BpmOAInvoiceDTO createReqVO) {
+
+ return success(invoiceService.createInvoice(getLoginUserId(), BeanUtils.toBean(createReqVO, BpmOAInvoiceCreateReqVO.class)));
+ }
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApiImpl.java
index 46eae554..265e0d0f 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApiImpl.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOALeaveApiImpl.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.bpm.api.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOALeaveRpcVO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.leave.BpmOALeaveRpcVO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApiImpl.java
index 257625b7..3cb6b141 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApiImpl.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/oa/BpmOARefundApiImpl.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.api.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOARefundDTO;
+import cn.iocoder.yudao.module.bpm.api.oa.vo.refund.BpmOARefundDTO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOARefundDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOARefundService;
import org.springframework.validation.annotation.Validated;
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAContractController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAContractController.java
index 9ce67c43..ad0b33b4 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAContractController.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAContractController.java
@@ -1,13 +1,23 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
+import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.ContractStatisticsRespVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAContractConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAContractDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAContractService;
+import cn.iocoder.yudao.module.hrm.api.crmbusiness.BusinessApi;
+import cn.iocoder.yudao.module.hrm.api.crmbusiness.dto.CrmBusinessDTO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -16,7 +26,9 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
+import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -39,8 +51,15 @@ public class BpmOAContractController {
@Resource
private AdminUserApi userApi;
+ @Resource
+ private DeptApi deptApi;
+
+ @Resource
+ private BusinessApi businessApi;
+
@PostMapping("/create")
@Operation(summary = "创建请求申请")
+ @Idempotent(timeout = 10)
public CommonResult createContract(@Valid @RequestBody BpmOAContractCreateReqVO createReqVO) {
return success(contractService.createContract(getLoginUserId(), createReqVO));
}
@@ -51,8 +70,31 @@ public class BpmOAContractController {
public CommonResult getContract(@RequestParam("id") Long id) {
BpmOAContractDO contract = contractService.getContract(id);
+ BpmOAContractRespVO respVO = BpmOAContractConvert.INSTANCE.convert(contract);
+ if (respVO != null) {
+ // 获取用户和签约人信息
+ List userIds = Arrays.asList(contract.getUserId(), contract.getSignatoryId());
+ Map userMap = userApi.getUserMap(userIds);
+ if (CollectionUtil.isNotEmpty(userMap)) {
+ // 设置创建人、签约人名称
+ respVO.setSignatoryName(userMap.get(contract.getSignatoryId()).getNickname());
+ respVO.setCreateName(userMap.get(contract.getUserId()).getNickname());
+ }
- return success(BpmOAContractConvert.INSTANCE.convert(contract));
+ // 获取公司信息
+ DeptRespDTO dto = deptApi.getDept(contract.getCompanyId()).getCheckedData();
+ if (dto != null) {
+ respVO.setCompanyName(dto.getName());
+ }
+
+ if (respVO.getBusinessId() != null) {
+ // 获取商机信息
+ CrmBusinessDTO businessDTO = businessApi.getBusiness(respVO.getBusinessId()).getCheckedData();
+ respVO.setBusinessName(businessDTO != null ? businessDTO.getName() : null);
+ }
+ }
+
+ return success(respVO);
}
@GetMapping("/getByProcessInstanceId")
@@ -61,12 +103,42 @@ public class BpmOAContractController {
public CommonResult getContractByProcessInstanceId(@RequestParam("processInstanceId") String processInstanceId) {
BpmOAContractDO contract = contractService.getByProcessInstanceId(processInstanceId);
+ BpmOAContractRespVO respVO = BpmOAContractConvert.INSTANCE.convert(contract);
+ if (respVO != null) {
+ // 获取用户和签约人信息
+ List userIds = Arrays.asList(contract.getUserId(), contract.getSignatoryId());
+ Map userMap = userApi.getUserMap(userIds);
+ if (CollectionUtil.isNotEmpty(userMap)) {
+ // 设置创建人、签约人名称
+ respVO.setSignatoryName(userMap.get(contract.getSignatoryId()).getNickname());
+ respVO.setCreateName(userMap.get(contract.getUserId()).getNickname());
+ }
- return success(BpmOAContractConvert.INSTANCE.convert(contract));
+ // 获取公司信息
+ DeptRespDTO dto = deptApi.getDept(contract.getCompanyId()).getCheckedData();
+ if (dto != null) {
+ respVO.setCompanyName(dto.getName());
+ }
+
+ if (respVO.getBusinessId() != null) {
+ // 获取商机信息
+ CrmBusinessDTO businessDTO = businessApi.getBusiness(respVO.getBusinessId()).getCheckedData();
+ respVO.setBusinessName(businessDTO != null ? businessDTO.getName() : null);
+ }
+ }
+
+ return success(respVO);
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得合同审批分页列表")
+ public CommonResult> getPage(@Valid BpmOAContractPageReqVO pageReqVO) {
+
+ return success(contractService.getContractPage(pageReqVO));
}
@GetMapping("/getListByDeptId")
- @Operation(summary = "获得同部门的合同审批")
+ @Operation(summary = "获得同部门的销售合同")
public CommonResult> getListByDeptId() {
// 获取同部门所有用户id
@@ -76,4 +148,16 @@ public class BpmOAContractController {
return success(BeanUtils.toBean(contracts, BpmOAContractRespVO.class));
}
+
+ @GetMapping("/get-contract-statistics")
+ @Operation(summary = "获得当日合同统计 | 新增数量、新增金额")
+ @Parameter(name = "relation", description = "查询类型 my我的 sub下属| ", required = true)
+ public CommonResult getListByDeptId(@RequestParam("relation") String relation) {
+
+ ContractStatisticsRespVO respVO = contractService.getContractStatistics(getLoginUserId(), relation);
+
+ return success(respVO);
+ }
+
+
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAInvoiceController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAInvoiceController.java
index 38b74947..93d49146 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAInvoiceController.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAInvoiceController.java
@@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.invoice.BpmOAInvoiceCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.invoice.BpmOAInvoicePageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.invoice.BpmOAInvoiceRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAInvoiceDO;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAInvoiceService;
@@ -61,4 +63,11 @@ public class BpmOAInvoiceController {
BpmOAInvoiceRespVO bpmOAInvoiceRespVO = BeanUtils.toBean(invoice, BpmOAInvoiceRespVO.class);
return success(bpmOAInvoiceRespVO);
}
+
+ @GetMapping("/page")
+ @Operation(summary = "获得开票申请分页列表")
+ public CommonResult> getPage(@Valid BpmOAInvoicePageReqVO pageReqVO) {
+
+ return success(invoiceService.getInvoicePage(pageReqVO));
+ }
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractCreateReqVO.java
index c5853fb1..2c7a26cc 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractCreateReqVO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractCreateReqVO.java
@@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract;
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
@@ -16,32 +18,78 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
* @author 符溶馨
*/
@Schema(description = "管理后台 - 合同审批创建 Request VO")
+@Data
public class BpmOAContractCreateReqVO {
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long id;
+
+ @Schema(description = "合同类型 | 字典值 bpm_oa_contract_type", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "合同类型不能为空")
+ private Integer contractType;
+
@Schema(description = "合同名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "合同名称不能为空")
private String contractName;
- @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "合同编号不能为空")
- private String contractNumber;
+ @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contractNo;
@Schema(description = "签约日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "签约日期不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate signingDate;
- @Schema(description = "我方公司名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String mCompanyName;
+ @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long customerId;
- @Schema(description = "我方负责人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String mHeadName;
+ @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String customerName;
- @Schema(description = "对方公司名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String oCompanyName;
+ @Schema(description = "客户签约人(联系人ID)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long contactsId;
- @Schema(description = "对方负责人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String oHeadName;
+ @Schema(description = "客户签约人(联系人)名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contactsName;
+
+ @Schema(description = "签约公司编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "签约公司不能为空")
+ private Long companyId;
+
+ @Schema(description = "签约人编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long signatoryId;
+
+ @Schema(description = "合同金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal contractMoney;
+
+ @Schema(description = "已收/已付金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal returnMoney;
+
+ @Schema(description = "已开票金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal invoiceMoney;
+
+ @Schema(description = "产品总金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal totalPrice;
+
+ @Schema(description = "整单优惠金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal discountRate;
+
+ @Schema(description = "商机ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long businessId;
+
+ @Schema(description = "合同开始时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private LocalDate startDate;
+
+ @Schema(description = "合同结束时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private LocalDate endDate;
+
+ @Schema(description = "合同状态 | 1已签约 2过期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Integer status;
+
+ @Schema(description = "合同产品关系列表")
+ private List contractProducts;
@Schema(description = "流程实例编号")
private String processInstanceId;
@@ -51,103 +99,4 @@ public class BpmOAContractCreateReqVO {
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List fileItems;
-
- public BpmOAContractCreateReqVO() {
- }
-
- public BpmOAContractCreateReqVO(String contractName, String contractNumber, LocalDate signingDate,
- String mCompanyName, String mHeadName, String oCompanyName,
- String oHeadName, String processInstanceId, List fileItems,
- Integer result) {
- this.contractName = contractName;
- this.contractNumber = contractNumber;
- this.signingDate = signingDate;
- this.mCompanyName = mCompanyName;
- this.mHeadName = mHeadName;
- this.oCompanyName = oCompanyName;
- this.oHeadName = oHeadName;
- this.processInstanceId = processInstanceId;
- this.result = result;
- this.fileItems = fileItems;
- }
-
- public Integer getResult() {
- return result;
- }
-
- public void setResult(Integer result) {
- this.result = result;
- }
-
- public String getContractName() {
- return contractName;
- }
-
- public String getProcessInstanceId() {
- return processInstanceId;
- }
-
- public void setProcessInstanceId(String processInstanceId) {
- this.processInstanceId = processInstanceId;
- }
-
- public void setContractName(String contractName) {
- this.contractName = contractName;
- }
-
- public String getContractNumber() {
- return contractNumber;
- }
-
- public void setContractNumber(String contractNumber) {
- this.contractNumber = contractNumber;
- }
-
- public LocalDate getSigningDate() {
- return signingDate;
- }
-
- public void setSigningDate(LocalDate signingDate) {
- this.signingDate = signingDate;
- }
-
- public String getmCompanyName() {
- return mCompanyName;
- }
-
- public void setmCompanyName(String mCompanyName) {
- this.mCompanyName = mCompanyName;
- }
-
- public String getmHeadName() {
- return mHeadName;
- }
-
- public void setmHeadName(String mHeadName) {
- this.mHeadName = mHeadName;
- }
-
- public String getoCompanyName() {
- return oCompanyName;
- }
-
- public void setoCompanyName(String oCompanyName) {
- this.oCompanyName = oCompanyName;
- }
-
- public String getoHeadName() {
- return oHeadName;
- }
-
- public void setoHeadName(String oHeadName) {
- this.oHeadName = oHeadName;
- }
-
- public List getFileItems() {
- return fileItems;
- }
-
- public void setFileItems(List fileItems) {
- this.fileItems = fileItems;
- }
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractPageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractPageReqVO.java
new file mode 100644
index 00000000..94e370ec
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractPageReqVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Schema(description = "管理后台 - 合同审批分页 Request VO")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class BpmOAContractPageReqVO extends PageParam {
+
+ @Schema(description = "合同类型 | 字典值 bpm_oa_contract_type", example = "1")
+ private Integer contractType;
+
+ @Schema(description = "客户名称,模糊匹配")
+ private String customerName;
+
+ @Schema(description = "合同名称,模糊匹配")
+ private String contractName;
+
+ @Schema(description = "合同编号")
+ private String contractNo;
+
+ @Schema(description = "审批结果")
+ private Integer result;
+
+ @Schema(description = "合同状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "签约人名称")
+ private String signatoryName;
+
+ @Schema(description = "创建人名称")
+ private String createName;
+
+ @Schema(description = "查询模式")
+ private String relation;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractRespVO.java
index e8ed1f3b..eaa30611 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractRespVO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/BpmOAContractRespVO.java
@@ -1,13 +1,12 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract;
-import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
-import javax.validation.constraints.NotNull;
-import java.time.LocalDate;
+import java.math.BigDecimal;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@@ -19,31 +18,81 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@Data
public class BpmOAContractRespVO extends BpmOABaseRespVO {
+ @Schema(description = "发起人用户编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long userId;
+
+ @Schema(description = "合同类型 | 字典值 bpm_oa_contract_type", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Integer contractType;
+
@Schema(description = "合同名称", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "合同名称不能为空")
private String contractName;
@Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "合同编号不能为空")
- private String contractNumber;
+ private String contractNo;
@Schema(description = "签约日期", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "签约日期不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
- private LocalDate signingDate;
+ private String signingDate;
- @Schema(description = "我方公司名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String mCompanyName;
+ @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long customerId;
- @Schema(description = "我方负责人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String mHeadName;
+ @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String customerName;
- @Schema(description = "对方公司名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String oCompanyName;
+ @Schema(description = "客户签约人(联系人ID)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long contactsId;
- @Schema(description = "对方负责人", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
- private String oHeadName;
+ @Schema(description = "客户签约人(联系人)名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contactsName;
+
+ @Schema(description = "签约公司编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long companyId;
+
+ @Schema(description = "签约公司名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String companyName;
+
+ @Schema(description = "签约人编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long signatoryId;
+
+ @Schema(description = "签约人名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String signatoryName;
+
+ @Schema(description = "合同金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal contractMoney;
+
+ @Schema(description = "已收/已付金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal returnMoney;
+
+ @Schema(description = "已开票金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal invoiceMoney;
+
+ @Schema(description = "产品总金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal totalPrice;
+
+ @Schema(description = "整单优惠金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private BigDecimal discountRate;
+
+ @Schema(description = "商机ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long businessId;
+
+ @Schema(description = "商机名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String businessName;
+
+ @Schema(description = "合同开始时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private String startDate;
+
+ @Schema(description = "合同结束时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private String endDate;
+
+ @Schema(description = "合同状态 | 1已签约 2过期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Integer status;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List fileItems;
+
+ @Schema(description = "创建人名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String createName;
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/ContractStatisticsRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/ContractStatisticsRespVO.java
new file mode 100644
index 00000000..e35ae618
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/ContractStatisticsRespVO.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 合同审批 请求Request VO")
+@Data
+public class ContractStatisticsRespVO {
+
+ @Schema(description = "用户编号")
+ private Long userId;
+
+ @Schema(description = "今日新增合同数")
+ private Integer todayAdditions;
+
+ @Schema(description = "昨日新增合同数")
+ private Integer yesterdayAdditions;
+
+ @Schema(description = "较昨日百分比 | 数量")
+ private BigDecimal countPercentage;
+
+ @Schema(description = "今日新增合同金额")
+ private BigDecimal todayAddMoney;
+
+ @Schema(description = "昨日新增合同金额")
+ private BigDecimal yesterdayAddMoney;
+
+ @Schema(description = "较昨日百分比 | 金额")
+ private BigDecimal moneyPercentage;
+
+ @Schema(description = "合同总数")
+ private Integer count;
+
+ @Schema(description = "合同总金额")
+ private BigDecimal money;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/CrmContractProductVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/CrmContractProductVO.java
new file mode 100644
index 00000000..42a0c3ce
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/contract/CrmContractProductVO.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 合同产品关联 Response VO")
+@Data
+public class CrmContractProductVO {
+
+ @Schema(description = "合同编号")
+ private Long contractId;
+
+ @Schema(description = "产品编号")
+ private Long productId;
+
+ @Schema(description = "产品名称")
+ private String name;
+
+ @Schema(description = "产品属性")
+ private String productAttrUnique;
+
+ @Schema(description = "产品单价")
+ private BigDecimal price;
+
+ @Schema(description = "数量")
+ private Integer nums;
+
+ @Schema(description = "折扣")
+ private BigDecimal discount;
+
+ @Schema(description = "小计")
+ private BigDecimal subtotal;
+
+ @Schema(description = "备注")
+ private String remarks;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceCreateReqVO.java
index 66ae8887..2a30a20d 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceCreateReqVO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceCreateReqVO.java
@@ -21,8 +21,35 @@ public class BpmOAInvoiceCreateReqVO {
@NotNull(message = "计划开票日期不能为空")
private LocalDate invoiceDate;
- @Schema(description = "项目编号")
- private Long projectId;
+ @Schema(description = "关联合同业务编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "合同编号不能为空")
+ private Long contractId;
+
+ @Schema(description = "关联合同流程实例编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contractInstanceId;
+
+ @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long customerId;
+
+ @Schema(description = "开票主体", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "开票主体不能为空")
+ private String invoiceBody;
+
+ @Schema(description = "发票抬头", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "发票抬头不能为空")
+ private String invoiceName;
+
+ @Schema(description = "抬头类型 | 1企业2个人3事业单位", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "抬头类型不能为空")
+ private Integer invoiceIssue;
+
+ @Schema(description = "发票类型 | 1普票 2专票", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "发票类型不能为空")
+ private Integer invoiceType;
+
+ @Schema(description = "统一社会信用代码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "统一社会信用代码不能为空")
+ private String registerNo;
@Schema(description = "开票金额", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开票金额不能为空")
@@ -32,14 +59,6 @@ public class BpmOAInvoiceCreateReqVO {
@NotNull(message = "开票内容不能为空")
private String content;
- @Schema(description = "开票单位名称", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "开票单位名称不能为空")
- private String unitName;
-
- @Schema(description = "开票单位纳税人识别号", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "开票单位纳税人识别号不能为空")
- private String unitTin;
-
@Schema(description = "开票单位地址")
private String unitAddress;
@@ -52,8 +71,11 @@ public class BpmOAInvoiceCreateReqVO {
@Schema(description = "开票单位银行账号")
private String unitBankNo;
- @Schema(description = "关联合同业务流程编号")
- private String contractInstanceId;
+ @Schema(description = "开票单位邮箱")
+ private String email;
+
+ @Schema(description = "开票状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Integer status;
@Schema(description = "流程实例编号")
private String processInstanceId;
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoicePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoicePageReqVO.java
new file mode 100644
index 00000000..9f6916a0
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoicePageReqVO.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.invoice;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Schema(description = "管理后台 - 合同审批分页 Request VO")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class BpmOAInvoicePageReqVO extends PageParam {
+
+ @Schema(description = "合同名称")
+ private String contractName;
+
+ @Schema(description = "客户名称,模糊匹配")
+ private String customerName;
+
+ @Schema(description = "审批结果")
+ private Integer result;
+
+ @Schema(description = "开票状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "查询模式")
+ private String relation;
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceRespVO.java
index 0e2af3c8..ad6dd51f 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceRespVO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/invoice/BpmOAInvoiceRespVO.java
@@ -20,8 +20,35 @@ public class BpmOAInvoiceRespVO extends BpmOABaseRespVO {
@Schema(description = "计划开票日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate invoiceDate;
- @Schema(description = "项目编号")
- private Long projectId;
+ @Schema(description = "关联合同业务编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long contractId;
+
+ @Schema(description = "合同名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contractName;
+
+ @Schema(description = "关联合同流程实例编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String contractInstanceId;
+
+ @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Long customerId;
+
+ @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private String customerName;
+
+ @Schema(description = "开票主体", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String invoiceBody;
+
+ @Schema(description = "发票抬头", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String invoiceName;
+
+ @Schema(description = "抬头类型 | 1企业2个人3事业单位", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Integer invoiceIssue;
+
+ @Schema(description = "发票类型 | 1普票 2专票", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Integer invoiceType;
+
+ @Schema(description = "统一社会信用代码", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String registerNo;
@Schema(description = "开票金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal amount;
@@ -29,12 +56,6 @@ public class BpmOAInvoiceRespVO extends BpmOABaseRespVO {
@Schema(description = "开票内容", requiredMode = Schema.RequiredMode.REQUIRED)
private String content;
- @Schema(description = "开票单位名称", requiredMode = Schema.RequiredMode.REQUIRED)
- private String unitName;
-
- @Schema(description = "开票单位纳税人识别号", requiredMode = Schema.RequiredMode.REQUIRED)
- private String unitTin;
-
@Schema(description = "开票单位地址")
private String unitAddress;
@@ -47,9 +68,12 @@ public class BpmOAInvoiceRespVO extends BpmOABaseRespVO {
@Schema(description = "开票单位银行账号")
private String unitBankNo;
- @Schema(description = "关联合同业务流程编号")
- private String contractInstanceId;
+ @Schema(description = "开票单位邮箱")
+ private String email;
- @Schema(description = "上传文件")
+ @Schema(description = "开票状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ private Integer status;
+
+ @Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List fileItems ;
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
index 0784a922..0ae0bbe8 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
@@ -5,17 +5,25 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.invoice.BpmOAInvoiceRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmHistoryProcessInstanceDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAContractService;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAInvoiceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
@@ -36,6 +44,7 @@ import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLogi
@RestController
@RequestMapping("/bpm/task")
@Validated
+@Slf4j
@DataPermission(enable = false)
public class BpmTaskController {
@@ -51,9 +60,16 @@ public class BpmTaskController {
@Resource
private DeptApi deptApi;
+ @Resource
+ private BpmOAContractService bpmOAContractService;
+
+ @Resource
+ private BpmOAInvoiceService bpmOAInvoiceService;
+
/**
* add by yaojun 2024.1.3
* 流程审核添加了抄送用户(多用户)的功能
+ *
* @param pageReqVO
* @return
*/
@@ -213,7 +229,7 @@ public class BpmTaskController {
if (CollUtil.isEmpty(userIds)) {
return success(userRespDTO);
}
- Map userMap = userApi.getUserMap(userIds.stream().map(Long::parseLong).collect(Collectors.toList()));
+ Map userMap = userApi.getUserMap(userIds.stream().map(Long::parseLong).collect(Collectors.toList()));
return success(convertList(userIds, id -> userMap.get(Long.valueOf(id))));
}
@@ -236,9 +252,43 @@ public class BpmTaskController {
@GetMapping("getCurrentToDoProcessInstacePreAndNex-page")
@Operation(summary = "获取当前待处理流程实例(带查询条件),上一个流程和下一个流程的实例ID")
- public CommonResult