telco_server/app/admin/service/bus_service/s_contract.go

272 lines
7.6 KiB
Go
Raw Normal View History

2025-04-02 11:39:51 +00:00
package bus_service
import (
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
"github.com/go-admin-team/go-admin-core/sdk/service"
"go-admin/app/admin/models/bus_models"
aliyun "go-admin/tools/ali"
"gorm.io/gorm"
"math/rand"
"strings"
"time"
)
type ContractService struct {
service.Service
}
// CreateContract 新建合同
func (s *ContractService) CreateContract(c *gin.Context, req bus_models.CreateContractReq) (bus_models.CreateContractResp, error) {
var resp bus_models.CreateContractResp
contract := bus_models.BusContract{
CooperativeNumber: req.CooperativeNumber,
CooperativeName: req.CooperativeName,
Files: req.Files,
Status: 1,
SignatoryAccount: user.GetUserName(c),
Remark: req.Remark,
}
contractNumber, err := GenerateContractNumber(s.Orm, "CN")
if err != nil {
fmt.Println("生成合同编号失败:", err)
} else {
fmt.Println("生成的合同编号为:", contractNumber)
}
contract.ContractNumber = contractNumber
if err := s.Orm.Create(&contract).Error; err != nil {
return resp, errors.New("创建合同失败")
}
resp.ContractNumber = contract.ContractNumber
return resp, nil
}
// EditContract 编辑合同信息
func (s *ContractService) EditContract(req bus_models.EditContractReq) error {
// 查找合同是否存在
var contract bus_models.BusContract
if err := s.Orm.Where("contract_number = ?", req.ContractNumber).First(&contract).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("合同不存在")
}
return err
}
// 更新字段
updateData := map[string]interface{}{}
if req.CooperativeNumber != "" {
updateData["cooperative_number"] = req.CooperativeNumber
}
if req.CooperativeName != "" {
updateData["cooperative_name"] = req.CooperativeName
}
if req.SignatoryAccount != "" {
updateData["signatory_account"] = req.SignatoryAccount
}
if req.Remark != "" {
updateData["remark"] = req.Remark
}
// 执行更新
if len(updateData) > 0 {
result := s.Orm.Model(&bus_models.BusContract{}).
Where("contract_number = ?", req.ContractNumber).
Updates(updateData)
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return errors.New("合同未更新或不存在")
}
}
return nil
}
// ListContracts 获取合同列表
func (s *ContractService) ListContracts(req bus_models.ListContractReq) (bus_models.ListContractResp, error) {
page := req.Page - 1
if page < 0 {
page = 0
}
if req.PageSize == 0 {
req.PageSize = 10
}
var resp bus_models.ListContractResp
var contracts []bus_models.BusContract
var total int64
query := s.Orm.Model(&bus_models.BusContract{})
if req.ContractNumber != "" {
query = query.Where("contract_number = ?", req.ContractNumber)
}
if req.CooperativeNumber != "" {
query = query.Where("cooperative_number = ?", req.CooperativeNumber)
}
if req.Status > 0 {
query = query.Where("status = ?", req.Status)
}
// 计算总数
if err := query.Count(&total).Error; err != nil {
return resp, err
}
// 分页查询
if err := query.Offset(page * req.PageSize).Limit(req.PageSize).Find(&contracts).Error; err != nil {
return resp, err
}
resp.List = contracts
resp.Total = len(contracts)
resp.Page = page + 1
resp.PageSize = req.PageSize
return resp, nil
}
// GetContractDetail 获取合同详情
func (s *ContractService) GetContractDetail(req bus_models.ContractDetailReq) (*bus_models.BusContract, error) {
var contract bus_models.BusContract
if err := s.Orm.Where("contract_number = ?", req.ContractNumber).First(&contract).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("合同不存在")
}
return nil, err
}
return &contract, nil
}
// UpdateContractRemark 编辑合同备注
func (s *ContractService) UpdateContractRemark(req bus_models.EditContractRemarkReq) error {
result := s.Orm.Model(&bus_models.BusContract{}).
Where("contract_number = ?", req.ContractNumber).
Update("remark", req.Remark)
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return errors.New("合同不存在")
}
return nil
}
// InvalidateContract 作废合同
func (s *ContractService) InvalidateContract(req bus_models.InvalidContractReq) error {
result := s.Orm.Model(&bus_models.BusContract{}).
Where("contract_number = ?", req.ContractNumber).
Update("status", 2)
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return errors.New("合同不存在")
}
return nil
}
// RemoveContract 删除合同
func (s *ContractService) RemoveContract(req bus_models.DeleteContractReq) error {
// 首先检查合同状态是否是作废status = 2
var contract bus_models.BusContract
err := s.Orm.Where("contract_number = ?", req.ContractNumber).First(&contract).Error
if err != nil {
return err // 如果查询失败,返回错误
}
// 如果合同的状态是作废status = 2则不允许删除
if contract.Status == 1 {
return errors.New("合同未作废,不能删除")
}
result := s.Orm.Where("contract_number = ?", req.ContractNumber).Delete(&bus_models.BusContract{})
if result.Error != nil {
return result.Error // 返回删除操作中的错误
}
if result.RowsAffected == 0 {
return errors.New("合同不存在") // 如果没有找到任何符合条件的合同
}
return nil // 删除成功
}
// GetContractDownloadLink 获取合同的下载链接
func (s *ContractService) GetContractDownloadLink(req bus_models.GetContractDownloadLinkReq) (
bus_models.GetContractDownloadLinkResp, error) {
var resp bus_models.GetContractDownloadLinkResp
// 查找合同是否存在
var contract bus_models.BusContract
if err := s.Orm.Where("contract_number = ?", req.ContractNumber).First(&contract).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return resp, errors.New("合同不存在")
}
return resp, err
}
// 解析 Files 字段,假设它是一个以分号分隔的文件名列表
files := strings.Split(contract.Files, ";")
if len(files) == 0 {
return resp, errors.New("合同文件不存在")
}
// 循环获取每个文件的预签名 URL
var downloadLinks []string
for _, file := range files {
// 调用 Aliyun OSS 的 GeneratePresignedURL 方法生成预签名 URL
downloadURL, err := aliyun.GeneratePresignedURL(file)
if err != nil {
return resp, err
}
downloadLinks = append(downloadLinks, downloadURL)
}
// 将所有的 URL 通过分号连接起来
resp.DownloadURL = downloadLinks
// 返回生成的下载链接
return resp, nil
}
// GenerateContractNumber 生成唯一的合同编号,格式为:合同简写+日期+8位随机数
func GenerateContractNumber(db *gorm.DB, contractPrefix string) (string, error) {
// 获取当前日期(年月日)
dateStr := time.Now().Format("20060102") // 格式为YYYYMMDD
// 生成一个8位随机数
rand.Seed(time.Now().UnixNano()) // 设置随机数种子
randomNum := rand.Int63n(100000000) // 生成一个0到99999999之间的随机数
// 将随机数转为固定长度的字符串确保8位
randomNumStr := fmt.Sprintf("%08d", randomNum) // 确保为8位不足补零
// 拼接合同简写、日期和随机数
contractNumber := fmt.Sprintf("%s%s%s", contractPrefix, dateStr, randomNumStr)
// 检查生成的合同编号是否已存在
var count int64
err := db.Model(&bus_models.BusContract{}).Where("contract_number = ?", contractNumber).Count(&count).Error
if err != nil {
return "", err
}
// 如果已存在,重新生成
if count > 0 {
return GenerateContractNumber(db, contractPrefix) // 递归重新生成
}
return contractNumber, nil
}