瀏覽代碼

Merge branch 'crm1.0' of hongze/hongze_mobile_admin into master

颜鹏 3 年之前
父節點
當前提交
494e541a87

+ 34 - 10
controllers/contract.go

@@ -9,7 +9,9 @@ import (
 	contractService "hongze/hongze_mobile_admin/services/contract"
 	"hongze/hongze_mobile_admin/services/seal"
 	"hongze/hongze_mobile_admin/utils"
+	"path"
 	"rdluck_tools/paging"
+	"strconv"
 	"strings"
 )
 
@@ -24,26 +26,48 @@ type ContractCommon struct {
 // @Success Ret=200 上传成功
 // @router /upload_check_back_file [post]
 func (c *ContractCommon) UploadCheckBackFile() {
-	var req contractReq.UploadCheckBackFileReq
-	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	//var req contractReq.UploadCheckBackFileReq
+	//err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	//if err != nil {
+	//	c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+	//	return
+	//}
+	////合同编号
+	//if req.ContractId <= 0 {
+	//	c.FailWithMessage("请传入合同编号!", "请传入合同编号")
+	//	return
+	//}
+	//
+	//if req.FileUrl == "" {
+	//	c.FailWithMessage("请先上传附件!", "请先上传附件")
+	//	return
+	//}
+	contractIdStr := c.Ctx.Request.Form.Get("ContractId")
+	if contractIdStr == "" {
+		c.FailWithMessage("合同ID必传!", "合同ID必传")
+		return
+	}
+	contractId, err := strconv.Atoi(contractIdStr)
 	if err != nil {
-		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		c.FailWithMessage("合同ID异常!", "合同ID必传")
 		return
 	}
 	//合同编号
-	if req.ContractId <= 0 {
-		c.FailWithMessage("请传入合同编号!", "请传入合同编号")
+	if contractId <= 0 {
+		c.FailWithMessage("请传入合同编号", "请传入合同编号")
 		return
 	}
-
-	if req.FileUrl == "" {
-		c.FailWithMessage("请先上传附件!", "请先上传附件")
+	fileMulti, h, err := c.GetFile("file")
+	if err != nil {
+		c.FailWithMessage("获取资源信息失败", "获取资源信息失败,Err:"+err.Error())
 		return
 	}
-	err = contractService.UploadCheckBackFile(req.ContractId, req.FileUrl, c.AdminWx)
+	ext := path.Ext(h.Filename)
+	//err = contractService.UploadCheckBackFile(contractId, req.FileUrl, c.AdminWx)
+	resourceUrl, err := contractService.UploadCheckBackFileByFile(contractId, ext, fileMulti, c.AdminWx)
 
 	//更新用印中的签回合同
-	_, _ = seal.UploadCheckBackFile(req.ContractId, req.FileUrl, c.AdminWx)
+	_, _ = seal.UploadCheckBackFile(contractId, resourceUrl, c.AdminWx)
 
 	c.OkWithMessage("上传成功")
 }

+ 5 - 0
controllers/contract_approval.go

@@ -258,6 +258,11 @@ func (c *ContractApprovalCommon) List() {
 			if item.Status == "待审批" && status == "处理中" {
 				list[i].Status = "处理中"
 			}
+
+			//如果是代付合同,那么就展示代付合同的审核内容
+			if item.ContractBusinessType == "代付合同" {
+				item.ApplyContent = "代付合同"
+			}
 		}
 	}
 

+ 37 - 12
controllers/seal.go

@@ -8,7 +8,9 @@ import (
 	contractService "hongze/hongze_mobile_admin/services/contract"
 	sealService "hongze/hongze_mobile_admin/services/seal"
 	"hongze/hongze_mobile_admin/utils"
+	"path"
 	"rdluck_tools/paging"
+	"strconv"
 )
 
 //SealCommon
@@ -317,30 +319,53 @@ func (c *SealCommon) Invalid() {
 // @Success Ret=200 上传成功
 // @router /upload_check_back_file [post]
 func (c *SealCommon) UploadCheckBackFile() {
-	var req sealReq.UploadCheckBackFileReq
-	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	//var req sealReq.UploadCheckBackFileReq
+	//err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	//if err != nil {
+	//	c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+	//	return
+	//}
+	////用印编号
+	//if req.SealId <= 0 {
+	//	c.FailWithMessage("请传入用印编号!", "请传入用印编号")
+	//	return
+	//}
+	//
+	//if req.FileUrl == "" {
+	//	c.FailWithMessage("请先上传附件!", "请先上传附件")
+	//	return
+	//}
+	sealIdStr := c.Ctx.Request.Form.Get("SealId")
+	if sealIdStr == "" {
+		c.FailWithMessage("用印ID必传!", "用印ID必传")
+		return
+	}
+	sealId, err := strconv.Atoi(sealIdStr)
 	if err != nil {
-		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		c.FailWithMessage("用印ID异常!", "用印ID必传")
 		return
 	}
-	//用印编号
-	if req.SealId <= 0 {
-		c.FailWithMessage("请传入用印编号!", "请传入用印编号")
+	//合同编号
+	if sealId <= 0 {
+		c.FailWithMessage("请传入用印编号", "请传入用印编号")
 		return
 	}
-
-	if req.FileUrl == "" {
-		c.FailWithMessage("请先上传附件!", "请先上传附件")
+	fileMulti, h, err := c.GetFile("file")
+	if err != nil {
+		c.FailWithMessage("获取资源信息失败", "获取资源信息失败,Err:"+err.Error())
 		return
 	}
-	sealInfo, err := sealService.UploadCheckBackFile(req.SealId, req.FileUrl, c.AdminWx)
+	ext := path.Ext(h.Filename)
+
+	//sealInfo, err := sealService.UploadCheckBackFile(req.SealId, req.FileUrl, c.AdminWx)
+	sealInfo, err := sealService.UploadCheckBackFileByFile(sealId, ext, fileMulti, c.AdminWx)
 	if err != nil {
-		c.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		c.FailWithMessage("更新签回附件失败!", "更新签回附件失败,Err:"+err.Error())
 		return
 	}
 	//如果是系统合同,那么需要去更新系统的签回附件
 	if sealInfo.ContractId > 0 {
-		_ = contractService.UploadCheckBackFile(sealInfo.ContractId, req.FileUrl, c.AdminWx)
+		_ = contractService.UploadCheckBackFile(sealInfo.ContractId, sealInfo.CheckBackFileUrl, c.AdminWx)
 	}
 	c.OkWithMessage("上传成功")
 }

+ 1 - 1
models/db_init.go

@@ -80,7 +80,7 @@ func init() {
 		new(resource.Resource),
 		new(wx_token.WxToken),
 		new(wx_user.WxUser),
-		new(seal.Seal),
+		new(seal.Seal), //用印表
 	)
 
 }

+ 131 - 117
models/tables/contract/contract.go

@@ -11,44 +11,45 @@ import (
 
 //合同
 type Contract struct {
-	ContractId        int       `orm:"column(contract_id);pk"`
-	ContractCode      string    `description:"合同编号,长度32位"`
-	SellerId          int       `description:"所属销售id"`
-	SellerName        string    `description:"所属销售名称"`
-	ProductId         int       `description:"产品id,1:ficc;2:权益"`
-	ContractType      string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
-	Status            string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回','已解约'"`
-	StartDate         time.Time `description:"合同开始日期"`
-	EndDate           time.Time `description:"合同结束日期"`
-	OriginalPrice     float64   `description:"合同原金额,优惠前的金额"`
-	Price             float64   `description:"实际金额,优惠后的金额"`
-	PayRemark         string    `description:"付款方式说明,长度255位"`
-	PayChannel        string    `description:"付款渠道,长度255位"`
-	CompanyName       string    `description:"客户名称,甲方名称,长度32位"`
-	CreditCode        string    `description:"社会统一信用代码,长度64位"`
-	ProvinceId        int       `description:"省级id"`
-	Province          string    `description:"省级名称,长度16位"`
-	CityId            int       `description:"市级id"`
-	City              string    `description:"市级名称,长度32位"`
-	Address           string    `description:"详细地址"`
-	Fax               string    `description:"传真,长度32位"`
-	Phone             string    `description:"电话,长度32位"`
-	Postcode          string    `description:"邮编,长度16位"`
-	Remark            string    `description:"补充内容,长度255位"`
-	ModifyContent     string    `description:"修改内容"`
-	ApprovalRemark    string    `description:"审核备注"`
-	FileUrl           string    `description:"合同文件地址"`
-	CheckBackFileUrl  string    `description:"签回合同文件地址"`
-	RescindFileUrl    string    `description:"解约合同文件地址"`
-	TemplateId        int       `description:"模板id"`
-	SourceId          int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
-	IsDelete          int       `description:"是否已经删除,0:未删除,1:已删除",json:"-"`
-	ApproveTime       time.Time `description:"审批时间"`
-	InvalidTime       time.Time `description:"作废时间"`
-	CheckBackFileTime time.Time `description:"合同签回时间"`
-	RescindTime       time.Time `description:"解约时间"`
-	ModifyTime        time.Time `description:"合同最近一次修改时间"`
-	CreateTime        time.Time `description:"合同添加时间"`
+	ContractId           int       `orm:"column(contract_id);pk"`
+	ContractCode         string    `description:"合同编号,长度32位"`
+	SellerId             int       `description:"所属销售id"`
+	SellerName           string    `description:"所属销售名称"`
+	ProductId            int       `description:"产品id,1:ficc;2:权益"`
+	ContractBusinessType string    `description:"合同业务类型,枚举值:'业务合同','代付合同'"`
+	ContractType         string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
+	Status               string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已签回','已解约'"`
+	StartDate            time.Time `description:"合同开始日期"`
+	EndDate              time.Time `description:"合同结束日期"`
+	OriginalPrice        float64   `description:"合同原金额,优惠前的金额"`
+	Price                float64   `description:"实际金额,优惠后的金额"`
+	PayRemark            string    `description:"付款方式说明,长度255位"`
+	PayChannel           string    `description:"付款渠道,长度255位"`
+	CompanyName          string    `description:"客户名称,甲方名称,长度32位"`
+	CreditCode           string    `description:"社会统一信用代码,长度64位"`
+	ProvinceId           int       `description:"省级id"`
+	Province             string    `description:"省级名称,长度16位"`
+	CityId               int       `description:"市级id"`
+	City                 string    `description:"市级名称,长度32位"`
+	Address              string    `description:"详细地址"`
+	Fax                  string    `description:"传真,长度32位"`
+	Phone                string    `description:"电话,长度32位"`
+	Postcode             string    `description:"邮编,长度16位"`
+	Remark               string    `description:"补充内容,长度255位"`
+	ModifyContent        string    `description:"修改内容"`
+	ApprovalRemark       string    `description:"审核备注"`
+	FileUrl              string    `description:"合同文件地址"`
+	CheckBackFileUrl     string    `description:"签回合同文件地址"`
+	RescindFileUrl       string    `description:"解约合同文件地址"`
+	TemplateId           int       `description:"模板id"`
+	SourceId             int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
+	IsDelete             int       `description:"是否已经删除,0:未删除,1:已删除",json:"-"`
+	ApproveTime          time.Time `description:"审批时间"`
+	InvalidTime          time.Time `description:"作废时间"`
+	CheckBackFileTime    time.Time `description:"合同签回时间"`
+	RescindTime          time.Time `description:"解约时间"`
+	ModifyTime           time.Time `description:"合同最近一次修改时间"`
+	CreateTime           time.Time `description:"合同添加时间"`
 }
 
 //更新合同基础信息
@@ -68,45 +69,46 @@ func GetContractById(contractId int) (contractInfo *Contract, err error) {
 
 //合同详情信息(包含服务信息等)
 type ContractDetail struct {
-	ContractId        int       `description:"合同唯一id"`
-	ContractCode      string    `description:"合同编号,长度32位"`
-	SellerId          int       `description:"所属销售id"`
-	SellerName        string    `description:"所属销售名称"`
-	ProductId         int       `description:"产品id,1:ficc;2:权益"`
-	ContractType      string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
-	Status            string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已解约'"`
-	StartDate         time.Time `description:"合同开始日期"`
-	EndDate           time.Time `description:"合同结束日期"`
-	OriginalPrice     float64   `description:"合同原金额,优惠前的金额"`
-	Price             float64   `description:"实际金额,优惠后的金额"`
-	PayRemark         string    `description:"付款方式说明,长度255位"`
-	PayChannel        string    `description:"付款渠道,长度255位"`
-	CompanyName       string    `description:"客户名称,甲方名称,长度32位"`
-	CreditCode        string    `description:"社会统一信用代码,长度64位"`
-	ProvinceId        int       `description:"省级id"`
-	Province          string    `description:"省级名称,长度16位"`
-	CityId            int       `description:"市级id"`
-	City              string    `description:"市级名称,长度32位"`
-	Address           string    `description:"详细地址"`
-	Fax               string    `description:"传真,长度32位"`
-	Phone             string    `description:"电话,长度32位"`
-	Postcode          string    `description:"邮编,长度16位"`
-	Remark            string    `description:"补充内容,长度255位"`
-	SellerRemark      string    `description:"销售备注,长度255位"`
-	ModifyContent     string    `description:"修改内容"`
-	ApprovalRemark    string    `description:"审核备注"`
-	FileUrl           string    `description:"合同文件地址"`
-	CheckBackFileUrl  string    `description:"签回合同文件地址"`
-	RescindFileUrl    string    `description:"解约合同文件地址"`
-	TemplateId        int       `description:"模板id"`
-	SourceId          int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
-	IsDelete          int       `json:"-" description:"是否已经删除,0:未删除,1:已删除"`
-	ModifyTime        time.Time `description:"合同最近一次修改时间"`
-	CreateTime        time.Time `description:"合同添加时间"`
-	ApproveTime       time.Time `description:"审批时间"`
-	InvalidTime       time.Time `description:"作废时间"`
-	CheckBackFileTime time.Time `description:"合同签回时间"`
-	RescindTime       time.Time `description:"解约时间"`
+	ContractId           int       `description:"合同唯一id"`
+	ContractCode         string    `description:"合同编号,长度32位"`
+	SellerId             int       `description:"所属销售id"`
+	SellerName           string    `description:"所属销售名称"`
+	ProductId            int       `description:"产品id,1:ficc;2:权益"`
+	ContractBusinessType string    `description:"合同业务类型,枚举值:'业务合同','代付合同'"`
+	ContractType         string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
+	Status               string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废','已解约'"`
+	StartDate            time.Time `description:"合同开始日期"`
+	EndDate              time.Time `description:"合同结束日期"`
+	OriginalPrice        float64   `description:"合同原金额,优惠前的金额"`
+	Price                float64   `description:"实际金额,优惠后的金额"`
+	PayRemark            string    `description:"付款方式说明,长度255位"`
+	PayChannel           string    `description:"付款渠道,长度255位"`
+	CompanyName          string    `description:"客户名称,甲方名称,长度32位"`
+	CreditCode           string    `description:"社会统一信用代码,长度64位"`
+	ProvinceId           int       `description:"省级id"`
+	Province             string    `description:"省级名称,长度16位"`
+	CityId               int       `description:"市级id"`
+	City                 string    `description:"市级名称,长度32位"`
+	Address              string    `description:"详细地址"`
+	Fax                  string    `description:"传真,长度32位"`
+	Phone                string    `description:"电话,长度32位"`
+	Postcode             string    `description:"邮编,长度16位"`
+	Remark               string    `description:"补充内容,长度255位"`
+	SellerRemark         string    `description:"销售备注,长度255位"`
+	ModifyContent        string    `description:"修改内容"`
+	ApprovalRemark       string    `description:"审核备注"`
+	FileUrl              string    `description:"合同文件地址"`
+	CheckBackFileUrl     string    `description:"签回合同文件地址"`
+	RescindFileUrl       string    `description:"解约合同文件地址"`
+	TemplateId           int       `description:"模板id"`
+	SourceId             int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
+	IsDelete             int       `json:"-" description:"是否已经删除,0:未删除,1:已删除"`
+	ModifyTime           time.Time `description:"合同最近一次修改时间"`
+	CreateTime           time.Time `description:"合同添加时间"`
+	ApproveTime          time.Time `description:"审批时间"`
+	InvalidTime          time.Time `description:"作废时间"`
+	CheckBackFileTime    time.Time `description:"合同签回时间"`
+	RescindTime          time.Time `description:"解约时间"`
 
 	StartDateStr         string `description:"合同起始时间"`
 	EndDateStr           string `description:"合同结束时间"`
@@ -118,10 +120,11 @@ type ContractDetail struct {
 	RescindTimeStr       string `description:"解约时间"`
 	Service              []*contract.ContractServiceAndDetail
 
-	PermissionLookList []*company_report_permission.PermissionLookList `description:"合同里面的权限列表"`
+	PermissionLookList         []*company_report_permission.PermissionLookList `description:"合同里面的权限列表"`
+	RelationContractDetailList []*ContractDetail                               `description:"关联合同详情"`
 }
 
-//根据合同id获取合同详情信息
+// GetContractDetailById 根据合同id获取合同详情信息
 func GetContractDetailById(contractId int) (contractInfo *ContractDetail, err error) {
 	o := orm.NewOrm()
 	sql := `select * from contract where contract_id = ? `
@@ -189,44 +192,45 @@ func AddContract(contractInfo *Contract, contractServiceAndDetailList []*contrac
 }
 
 type ContractList struct {
-	ContractId        int       `description:"合同唯一id"`
-	ContractCode      string    `description:"合同编号,长度32位"`
-	SellerId          int       `description:"所属销售id"`
-	SellerName        string    `description:"所属销售名称"`
-	ProductId         int       `description:"产品id,1:ficc;2:权益"`
-	ContractType      string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
-	Status            string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'"`
-	StartDate         time.Time `description:"合同开始日期"`
-	EndDate           time.Time `description:"合同结束日期"`
-	OriginalPrice     float64   `description:"合同原金额,优惠前的金额"`
-	Price             float64   `description:"实际金额,优惠后的金额"`
-	PayRemark         string    `description:"付款方式说明,长度255位"`
-	CompanyName       string    `description:"客户名称,甲方名称,长度32位"`
-	UseCompanyName    string    `description:"使用方名称,长度32位"`
-	CreditCode        string    `description:"社会统一信用代码,长度64位"`
-	ProvinceId        int       `description:"省级id"`
-	Province          string    `description:"省级名称,长度16位"`
-	CityId            int       `description:"市级id"`
-	City              string    `description:"市级名称,长度32位"`
-	Address           string    `description:"详细地址"`
-	Fax               string    `description:"传真,长度32位"`
-	Phone             string    `description:"电话,长度32位"`
-	Postcode          string    `description:"邮编,长度16位"`
-	Remark            string    `json:"-" description:"补充内容,长度255位"`
-	SellerRemark      string    `description:"销售备注,长度255位"`
-	ApprovalRemark    string    `description:"审核备注"`
-	ModifyContent     string    `description:"修改内容"`
-	FileUrl           string    `description:"合同文件地址"`
-	CheckBackFileUrl  string    `description:"签回合同文件地址"`
-	TemplateId        int       `description:"模板id"`
-	SourceId          int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
-	IsDelete          int       `json:"-" description:"是否已经删除,0:未删除,1:已删除"`
-	ModifyTime        time.Time `description:"合同最近一次修改时间"`
-	CreateTime        time.Time `description:"合同添加时间"`
-	ApproveTime       time.Time `description:"审批时间"`
-	InvalidTime       time.Time `description:"作废时间"`
-	CheckBackFileTime time.Time `description:"合同签回时间"`
-	RescindTime       time.Time `description:"解约时间"`
+	ContractId           int       `description:"合同唯一id"`
+	ContractCode         string    `description:"合同编号,长度32位"`
+	SellerId             int       `description:"所属销售id"`
+	SellerName           string    `description:"所属销售名称"`
+	ProductId            int       `description:"产品id,1:ficc;2:权益"`
+	ContractBusinessType string    `description:"合同业务类型,枚举值:'业务合同','代付合同'"`
+	ContractType         string    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
+	Status               string    `description:"合同状态,枚举值:'待提交','待审批','已撤回','已审批','已驳回','已作废'"`
+	StartDate            time.Time `description:"合同开始日期"`
+	EndDate              time.Time `description:"合同结束日期"`
+	OriginalPrice        float64   `description:"合同原金额,优惠前的金额"`
+	Price                float64   `description:"实际金额,优惠后的金额"`
+	PayRemark            string    `description:"付款方式说明,长度255位"`
+	CompanyName          string    `description:"客户名称,甲方名称,长度32位"`
+	UseCompanyName       string    `description:"使用方名称,长度32位"`
+	CreditCode           string    `description:"社会统一信用代码,长度64位"`
+	ProvinceId           int       `description:"省级id"`
+	Province             string    `description:"省级名称,长度16位"`
+	CityId               int       `description:"市级id"`
+	City                 string    `description:"市级名称,长度32位"`
+	Address              string    `description:"详细地址"`
+	Fax                  string    `description:"传真,长度32位"`
+	Phone                string    `description:"电话,长度32位"`
+	Postcode             string    `description:"邮编,长度16位"`
+	Remark               string    `json:"-" description:"补充内容,长度255位"`
+	SellerRemark         string    `description:"销售备注,长度255位"`
+	ApprovalRemark       string    `description:"审核备注"`
+	ModifyContent        string    `description:"修改内容"`
+	FileUrl              string    `description:"合同文件地址"`
+	CheckBackFileUrl     string    `description:"签回合同文件地址"`
+	TemplateId           int       `description:"模板id"`
+	SourceId             int       `description:"来源合同id,默认是0;如果是通过其他合同复制过来的,那么就是原合同的id"`
+	IsDelete             int       `json:"-" description:"是否已经删除,0:未删除,1:已删除"`
+	ModifyTime           time.Time `description:"合同最近一次修改时间"`
+	CreateTime           time.Time `description:"合同添加时间"`
+	ApproveTime          time.Time `description:"审批时间"`
+	InvalidTime          time.Time `description:"作废时间"`
+	CheckBackFileTime    time.Time `description:"合同签回时间"`
+	RescindTime          time.Time `description:"解约时间"`
 
 	StartDateStr         string `description:"合同起始时间"`
 	EndDateStr           string `description:"合同结束时间"`
@@ -421,3 +425,13 @@ func GetCompanyNameList(sellerId int, keyword, status string) (list []*CompanyNa
 	_, err = o.Raw(sql, pars).QueryRows(&list)
 	return
 }
+
+// UpdateBusinessContractPaidPrice 更新合同已支付金额
+func UpdateBusinessContractPaidPrice(contractId int, updatePriceStr string) (err error) {
+	o := orm.NewOrm()
+
+	//删除合同的原始服务信息
+	sql := `update contract set paid_price=paid_price` + updatePriceStr + ` where contract_id = ?`
+	_, err = o.Raw(sql, contractId).Exec()
+	return
+}

+ 9 - 7
models/tables/contract_approval/contract_approval.go

@@ -93,6 +93,7 @@ type ContractApprovalList struct {
 	ContractDetail           string                  `json:"-" description:"提交审批时的合同信息;合同快照"`
 	ContractInfo             contract.ContractDetail `json:"-" description:"提交审批时的合同信息;合同快照"`
 	ApproveRemark            string                  `description:"审核备注"`
+	ContractBusinessType     string                  `description:"合同业务类型,枚举值:'业务合同','代付合同'"`
 	ContractType             string                  `description:"合同类型"`
 	Price                    float64                 `description:"合同金额"`
 	CompanyName              string                  `description:"客户名称"`
@@ -119,13 +120,13 @@ type ContractApprovalList struct {
 	RescindTimeStr           string                  `description:"解约时间(字符串类型)"`
 }
 
-//获取合同审批列表数据
+// GetContractApprovalList 获取合同审批列表数据
 func GetContractApprovalList(childCondition, condition, joinCondition string, childPars, pars []interface{}, startSize, pageSize int) (list []*ContractApprovalList, err error) {
 	o := orm.NewOrm()
 	sql := `
 SELECT
 a.contract_approval_id,d.contract_approval_record_id,a.contract_id,a.apply_content,a.approve_remark,a.create_time,a.modify_time,a.status approve_status,c.status,c.product_id,
-c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.credit_code,c.seller_id,c.seller_name,c.file_url,c.contract_code,c.approve_time,c.invalid_time,c.check_back_file_time,c.rescind_time from contract_approval a
+c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.credit_code,c.seller_id,c.seller_name,c.file_url,c.contract_code,c.approve_time,c.invalid_time,c.check_back_file_time,c.rescind_time,c.contract_business_type from contract_approval a
 	join 
 	( SELECT max( contract_approval_id ) max_id,contract_id FROM contract_approval where 1=1 `
 	sql += childCondition
@@ -139,7 +140,7 @@ WHERE c.is_delete = 0  AND a.approval_type="contract" `
 	return
 }
 
-//获取审批后的数据
+// GetContractApprovalListCountV2 获取审批后的数据(待审批、处理中的)
 func GetContractApprovalListCountV2(childCondition, condition string, childPars, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `
@@ -161,12 +162,13 @@ WHERE c.is_delete = 0  AND a.approval_type="contract" `
 	return
 }
 
+// GetContractApprovalListV2 获取审批后的数据(待审批、处理中的)
 func GetContractApprovalListV2(childCondition, condition, orderBy string, childPars, pars []interface{}, startSize, pageSize int) (list []*ContractApprovalList, err error) {
 	o := orm.NewOrm()
 	sql := `
 SELECT
 a.contract_approval_id,d.contract_approval_record_id,a.contract_id,a.apply_content,a.approve_remark,a.create_time,a.modify_time,a.status approve_status,c.status,c.product_id,
-c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.credit_code,c.seller_id,c.seller_name,c.file_url,c.contract_code,c.approve_time,c.invalid_time,c.check_back_file_time,c.rescind_time from contract_approval a
+c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.credit_code,c.seller_id,c.seller_name,c.file_url,c.contract_code,c.approve_time,c.invalid_time,c.check_back_file_time,c.rescind_time,c.contract_business_type from contract_approval a
 	join 
 	( SELECT max( contract_approval_id ) max_id,contract_id FROM contract_approval where 1=1 `
 	sql += childCondition
@@ -198,7 +200,7 @@ WHERE c.is_delete = 0  AND a.approval_type="contract" `
 	return
 }
 
-//合同客户统计数
+// GetContractListCountV2 合同客户统计数(包含待提交的)
 func GetContractListCountV2(childCondition, condition, joinCondition, unionCondition string, childPars, pars, unionPars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `
@@ -226,13 +228,13 @@ where is_delete=0 and b.contract_approval_id is null ` + unionCondition + `)`
 	return
 }
 
-//获取合同审批列表数据
+// GetContractListV2 获取合同审批列表数据(包含待提交的)
 func GetContractListV2(childCondition, condition, joinCondition, unionCondition string, childPars, pars, unionPars []interface{}, startSize, pageSize int) (list []*ContractApprovalList, err error) {
 	o := orm.NewOrm()
 	sql := `
 SELECT
 a.contract_approval_id,d.contract_approval_record_id,a.contract_id,a.apply_content,a.approve_remark,a.create_time,a.modify_time,a.status approve_status,c.status,c.product_id,
-c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.seller_id,c.seller_name,c.file_url,c.contract_code,c.approve_time,c.invalid_time,c.check_back_file_time,c.rescind_time from contract_approval a
+c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.seller_id,c.seller_name,c.file_url,c.contract_code,c.approve_time,c.invalid_time,c.check_back_file_time,c.rescind_time,c.contract_business_type from contract_approval a
 	join 
 	( SELECT max( contract_approval_id ) max_id,contract_id FROM contract_approval where 1=1 `
 	sql += childCondition

+ 70 - 0
models/tables/contract_relation/contract_relation.go

@@ -0,0 +1,70 @@
+package contract_relation
+
+import (
+	"hongze/hongze_mobile_admin/models/custom/contract"
+	"rdluck_tools/orm"
+)
+
+// ContractRelation 合同关系表结构体
+type ContractRelation struct {
+	ContractId                int `description:"业务合同id"`
+	PaymentOnBehalfContractId int `description:"代付合同id"`
+}
+
+type RelationContractList struct {
+	ContractId                int     `description:"合同id"`
+	CompanyName               string  `description:"甲方名称"`
+	PaymentOnBehalfContractId int     `description:"代付合同id"`
+	Price                     float64 `description:"付款金额"`
+	Service                   []*contract.ContractServiceAndDetail
+	//ContractId int `description:"合同id"`
+}
+
+// GetContractRelationListByRelationContractIds 根据业务合同id集合获取对应的业务合同基础信息
+func GetContractRelationListByRelationContractIds(contractIdStr string) (list []*RelationContractList, err error) {
+	o := orm.NewOrm()
+	sql := `select b.contract_id,a.company_name,b.payment_on_behalf_contract_id from contract a join contract_relation b on a.contract_id=b.payment_on_behalf_contract_id where a.status in ("已签回","已审批") AND a.is_delete = 0 AND b.contract_id in (` + contractIdStr + `)  order by a.contract_id asc`
+
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetContractRelationListByPaymentOnBehalfContractIds 根据代付合同id集合获取对应的代付合同基础信息
+func GetContractRelationListByPaymentOnBehalfContractIds(contractIdStr string) (list []*RelationContractList, err error) {
+	o := orm.NewOrm()
+	sql := `select  a.contract_id,a.company_name,b.payment_on_behalf_contract_id from contract a join contract_relation b on a.contract_id=b.contract_id
+where a.status in ("已签回","已审批") AND a.is_delete = 0 AND b.payment_on_behalf_contract_id in (` + contractIdStr + `) order by a.contract_id asc`
+
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetContractRelationListByRelationContractId 根据业务合同id获取对应的代付合同基础信息
+func GetContractRelationListByRelationContractId(contractId int) (list []*RelationContractList, err error) {
+	o := orm.NewOrm()
+	sql := `select b.contract_id,a.company_name,b.payment_on_behalf_contract_id from contract a join contract_relation b on  a.contract_id=b.payment_on_behalf_contract_id
+where a.status in ("已签回","已审批") AND a.is_delete = 0 AND b.contract_id =?  order by a.contract_id asc`
+
+	_, err = o.Raw(sql, contractId).QueryRows(&list)
+	return
+}
+
+// GetContractRelationListByPaymentOnBehalfContractId 根据代付合同id获取对应的代付合同基础信息
+func GetContractRelationListByPaymentOnBehalfContractId(contractId int) (list []*RelationContractList, err error) {
+	o := orm.NewOrm()
+	sql := `select  a.contract_id,a.company_name,b.payment_on_behalf_contract_id from contract a join contract_relation b on  a.contract_id=b.contract_id
+where a.status in ("已签回","已审批") AND a.is_delete = 0 AND b.payment_on_behalf_contract_id =? order by a.contract_id asc`
+
+	_, err = o.Raw(sql, contractId).QueryRows(&list)
+	return
+}
+
+// GetContractRelationListByContractId 根据业务合同id获取已经给他代付过的合同列表
+func GetContractRelationListByContractId(contractId int) (list []*RelationContractList, err error) {
+	o := orm.NewOrm()
+	sql := `select  b.contract_id,a.company_name,b.payment_on_behalf_contract_id,a.price from contract a join contract_relation b on  a.contract_id=b.payment_on_behalf_contract_id
+where a.status in ("已签回","已审批","待审批") AND a.is_delete = 0 AND b.contract_id =? order by a.contract_id asc`
+
+	_, err = o.Raw(sql, contractId).QueryRows(&list)
+	return
+}

+ 114 - 2
services/contract/contract.go

@@ -13,8 +13,11 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/contract_approval"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval_record"
 	"hongze/hongze_mobile_admin/models/tables/contract_operation_record"
+	"hongze/hongze_mobile_admin/models/tables/contract_relation"
 	"hongze/hongze_mobile_admin/models/tables/contract_service_detail"
+	"hongze/hongze_mobile_admin/services"
 	"hongze/hongze_mobile_admin/utils"
+	"mime/multipart"
 	"rdluck_tools/orm"
 	"reflect"
 	"strings"
@@ -54,11 +57,64 @@ func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) {
 	//添加操作日志
 	remark := "作废合同模板"
 	_ = contract_operation_record.AddContractOperationRecord(nowContract.ContractId, opUser.AdminId, 0, "invalid", opUser.RealName, remark)
+
+	//修改业务合同的已支付金额
+	if nowContract.ContractBusinessType == "代付合同" {
+		go updateContractPaidPriceByPaymentOnBehalfContractId(nowContract.ContractId, -nowContract.Price)
+	}
 	return
 }
 
 // GetContractDetail 根据id获取合同详情(包含服务)
 func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
+	contractDetail, err = getContractDetail(contractId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = errors.New("找不到该合同")
+		}
+		return
+	}
+	relationContractDetailList := make([]*contract.ContractDetail, 0)
+	switch contractDetail.ContractBusinessType {
+	case "业务合同":
+		tmpList, tmpErr := contract_relation.GetContractRelationListByRelationContractId(contractDetail.ContractId)
+		if tmpErr != nil {
+			err = errors.New("查询业务关联合同异常:" + tmpErr.Error())
+			return
+		}
+
+		//获取所有关联合同详情
+		for _, relationContract := range tmpList {
+			tmpContractDetail, tmpErr := getContractDetail(relationContract.PaymentOnBehalfContractId)
+			if tmpErr != nil {
+				err = errors.New("查询业务关联合同详情异常:" + tmpErr.Error())
+				return
+			}
+			relationContractDetailList = append(relationContractDetailList, tmpContractDetail)
+		}
+	case "代付合同":
+		tmpList, tmpErr := contract_relation.GetContractRelationListByPaymentOnBehalfContractId(contractDetail.ContractId)
+		if tmpErr != nil {
+			err = errors.New("查询代付关联合同异常:" + tmpErr.Error())
+			return
+		}
+
+		//获取所有关联合同详情
+		for _, relationContract := range tmpList {
+			tmpContractDetail, tmpErr := getContractDetail(relationContract.ContractId)
+			if tmpErr != nil {
+				err = errors.New("查询业务关联合同详情异常:" + tmpErr.Error())
+				return
+			}
+			relationContractDetailList = append(relationContractDetailList, tmpContractDetail)
+		}
+	}
+	contractDetail.RelationContractDetailList = relationContractDetailList
+	return
+}
+
+// getContractDetail 根据id获取合同详情(包含服务)
+func getContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
 	contractDetail, err = contract.GetContractDetailById(contractId)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
@@ -66,6 +122,7 @@ func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail,
 		}
 		return
 	}
+	//获取合同服务内容详情
 	serviceList, err := contractCustom.GetContractServiceAndDetailList(contractId)
 	if err != nil {
 		err = errors.New(fmt.Sprint("查找合同服务异常", err))
@@ -85,6 +142,53 @@ func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail,
 	return
 }
 
+// UploadCheckBackFileByFile 上传签回合同附件
+func UploadCheckBackFileByFile(contractId int, ext string, fileMulti multipart.File, opUser *custom.AdminWx) (resourceUrl string, err error) {
+	//获取合同信息
+	contractInfo, err := contract.GetContractById(contractId)
+	if err != nil {
+		return
+	}
+	//合同状态判断
+	if contractInfo.Status != "已审批" && contractInfo.Status != "已签回" {
+		err = errors.New("合同状态异常,不允许上传签回合同附件,当前合同状态:" + contractInfo.Status)
+		return
+	}
+
+	//保存的文件名
+	fileName := contractInfo.CompanyName + "_" + contractInfo.ContractCode + "(签回)"
+	//非正式环境下,文件名上面还是加上随机数
+	if utils.RunMode != "release" {
+		fileName += "_" + utils.GetRandStringNoSpecialChar(10)
+	}
+	fileName += ext
+	//上传到阿里云
+	resourceUrl, err = services.UploadToOssAndFileName(fileMulti, fileName)
+	if err != nil {
+		err = errors.New("文件保存失败,Err:" + err.Error())
+		return
+	}
+
+	contractInfo.CheckBackFileUrl = resourceUrl
+	contractInfo.Status = "已签回"
+	contractInfo.ModifyTime = time.Now()
+	contractInfo.CheckBackFileTime = time.Now()
+	err = contractInfo.Update([]string{"CheckBackFileUrl", "Status", "ModifyTime", "CheckBackFileTime"})
+	if err != nil {
+		return
+	}
+
+	//同步更新客户那边提交审批的合同
+	o := orm.NewOrm()
+	sql := `update company_contract set img_url = ?  where contract_code=? and source="系统合同" `
+	_, err = o.Raw(sql, contractInfo.CheckBackFileUrl, contractInfo.ContractCode).Exec()
+
+	//添加操作日志
+	remark := "上传签回合同附件"
+	_ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUser.AdminId, 0, "upload", opUser.RealName, remark)
+	return
+}
+
 // UploadCheckBackFile 更新上传签回合同附件
 func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx) (err error) {
 	//获取合同信息
@@ -175,8 +279,16 @@ func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (cont
 	contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime)
 
 	//合同中包含的产品权限
-	permissionLookList, _ := GetPermissionByContractService(contractInfo.ProductId, contractInfo.Service)
-	contractInfo.PermissionLookList = permissionLookList
+	isNeedPermission := false //是否需要列出来套餐中的详细权限
+	for _, service := range contractInfo.Service {
+		if service.ServiceTemplateId == 2 { //小套餐才需要列出来详细的权限
+			isNeedPermission = true
+		}
+	}
+	if isNeedPermission {
+		permissionLookList, _ := GetPermissionByContractService(contractInfo.ProductId, contractInfo.Service)
+		contractInfo.PermissionLookList = permissionLookList
+	}
 
 	//查询最近一次审批单信息
 	lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")

+ 28 - 0
services/contract/contract_approval.go

@@ -15,9 +15,11 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/contract_approval"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval_record"
 	"hongze/hongze_mobile_admin/models/tables/contract_operation_record"
+	"hongze/hongze_mobile_admin/models/tables/contract_relation"
 	"hongze/hongze_mobile_admin/services"
 	"hongze/hongze_mobile_admin/services/flow"
 	"hongze/hongze_mobile_admin/utils"
+	"math"
 	"os"
 	"strings"
 	"time"
@@ -806,6 +808,11 @@ func AfterApproved(contractId int) (err error) {
 		}
 
 	}
+
+	//修改业务合同的已支付金额
+	if contractDetail.ContractBusinessType == "代付合同" {
+		go updateContractPaidPriceByPaymentOnBehalfContractId(contractDetail.ContractId, contractDetail.Price)
+	}
 	return
 }
 
@@ -892,3 +899,24 @@ func FixPdf(contractId int) (err error) {
 	}
 	return
 }
+
+// updateContractPaidPriceByPaymentOnBehalfContractId 根据代付合同id来修改业务合同的支付金额
+func updateContractPaidPriceByPaymentOnBehalfContractId(contractId int, price float64) (err error) {
+	tmpList, tmpErr := contract_relation.GetContractRelationListByPaymentOnBehalfContractId(contractId)
+	if tmpErr != nil {
+		return
+	}
+	if len(tmpList) < 0 {
+		err = errors.New("未关联业务合同")
+		return
+	}
+
+	updatePriceStr := ``
+	if price > 0 {
+		updatePriceStr = `+` + fmt.Sprint(price)
+	} else {
+		updatePriceStr = `-` + fmt.Sprint(math.Abs(price))
+	}
+	err = contract.UpdateBusinessContractPaidPrice(tmpList[0].ContractId, updatePriceStr)
+	return
+}

+ 62 - 0
services/file.go

@@ -0,0 +1,62 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_mobile_admin/models/tables/resource"
+	"hongze/hongze_mobile_admin/utils"
+	"io"
+	"mime/multipart"
+	"os"
+	"time"
+)
+
+// UploadToOssAndFileName 上传到oss并使用这个名称
+func UploadToOssAndFileName(fileMulti multipart.File, newFileName string) (resourceUrl string, err error) {
+	dateDir := time.Now().Format("20060102")
+	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
+	err = os.MkdirAll(uploadDir, 766)
+	if err != nil {
+		err = errors.New("存储目录创建失败,Err:" + err.Error())
+		return
+	}
+
+	//本地地址
+	fpath := uploadDir + "/" + newFileName
+	err = saveToFile(fileMulti, fpath)
+	if err != nil {
+		err = errors.New("文件上传失败,Err:" + err.Error())
+		return
+	}
+	//上传到阿里云
+	resourceUrl, err = UploadAliyun(newFileName, fpath)
+	if err != nil {
+		err = errors.New("文件上传失败,Err:" + err.Error())
+		return
+	}
+
+	defer func() {
+		os.Remove(fpath)
+	}()
+
+	item := new(resource.Resource)
+	item.ResourceUrl = resourceUrl
+	item.ResourceType = 1
+	item.CreateTime = time.Now()
+	_, err = resource.AddResource(item)
+	if err != nil {
+		err = errors.New("资源上传失败,Err:" + err.Error())
+		return
+	}
+	return
+}
+
+// saveToFile 保存到本地文件
+func saveToFile(fileMulti multipart.File, tofile string) error {
+	f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	io.Copy(f, fileMulti)
+	return nil
+}

+ 52 - 0
services/seal/seal.go

@@ -6,12 +6,14 @@ import (
 	"hongze/hongze_mobile_admin/models/custom"
 	sealResp "hongze/hongze_mobile_admin/models/response/seal"
 	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/models/tables/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval_record"
 	"hongze/hongze_mobile_admin/models/tables/seal"
 	"hongze/hongze_mobile_admin/services"
 	contractService "hongze/hongze_mobile_admin/services/contract"
 	"hongze/hongze_mobile_admin/utils"
+	"mime/multipart"
 	"strings"
 	"time"
 )
@@ -306,6 +308,56 @@ func Invalid(sealId int, opUser *custom.AdminWx, isInvalidContract bool) (err er
 	return
 }
 
+// UploadCheckBackFileByFile 上传签回用印附件(实际操作)
+func UploadCheckBackFileByFile(sealId int, ext string, fileMulti multipart.File, opUser *custom.AdminWx) (sealInfo *seal.Seal, err error) {
+	//查询当前用印信息
+	sealInfo, err = seal.GetSealInfoById(sealId)
+	if err != nil {
+		return
+	}
+
+	//用印状态判断
+	if sealInfo.Status != "已审批" && sealInfo.Status != "已签回" {
+		err = errors.New("用印状态异常,不允许上传签回用印附件,当前用印状态:" + sealInfo.Status)
+		return
+	}
+
+	fileName := ``
+	//保存的文件名
+	fileName = sealInfo.CompanyName + "_" + sealInfo.Code + "(签回)"
+	if sealInfo.ContractId > 0 {
+		//获取合同信息
+		contractInfo, tmpErr := contract.GetContractById(sealInfo.ContractId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		//保存的文件名
+		fileName = contractInfo.CompanyName + "_" + contractInfo.ContractCode + "(签回)"
+	}
+	//非正式环境下,文件名上面还是加上随机数
+	if utils.RunMode != "release" {
+		fileName += "_" + utils.GetRandStringNoSpecialChar(10)
+	}
+	fileName += ext
+	//上传到阿里云
+	resourceUrl, err := services.UploadToOssAndFileName(fileMulti, fileName)
+	if err != nil {
+		err = errors.New("文件保存失败,Err:" + err.Error())
+		return
+	}
+
+	sealInfo.CheckBackFileUrl = resourceUrl
+	sealInfo.Status = "已签回"
+	sealInfo.ModifyTime = time.Now()
+	sealInfo.CheckBackFileTime = time.Now()
+	err = sealInfo.Update([]string{"CheckBackFileUrl", "Status", "ModifyTime", "CheckBackFileTime"})
+	if err != nil {
+		return
+	}
+	return
+}
+
 // UploadCheckBackFile 上传签回用印附件(实际操作)
 func UploadCheckBackFile(sealId int, fileUrl string, opUser *custom.AdminWx) (sealInfo *seal.Seal, err error) {
 	//查询当前用印信息

+ 21 - 5
services/word.go

@@ -12,6 +12,7 @@ import (
 	"fmt"
 	wkhtml "github.com/SebastiaanKlippert/go-wkhtmltopdf"
 	"github.com/shopspring/decimal"
+	contractCustom "hongze/hongze_mobile_admin/models/custom/contract"
 	contractReq "hongze/hongze_mobile_admin/models/request/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract_service_detail"
@@ -1080,6 +1081,21 @@ type WordElement struct {
 
 // GenerateWordV2 生成word
 func GenerateWordV2(contractDetail *contract.ContractDetail, wordPath string) (err error) {
+	//临时合同信息
+	tmpContractDetail := *contractDetail
+	//合同服务
+	contractServiceAndDetailList := make([]*contractCustom.ContractServiceAndDetail, 0) //服务内容
+	if tmpContractDetail.ContractBusinessType == "代付合同" {
+		if contractDetail.RelationContractDetailList != nil && len(contractDetail.RelationContractDetailList) > 0 {
+			tmpContractDetail.StartDate = tmpContractDetail.RelationContractDetailList[0].StartDate
+			tmpContractDetail.EndDate = tmpContractDetail.RelationContractDetailList[0].EndDate
+			contractServiceAndDetailList = tmpContractDetail.RelationContractDetailList[0].Service
+		}
+	} else {
+		contractServiceAndDetailList = tmpContractDetail.Service
+	}
+
+	//模板信息
 	contractTemplate, err := contract_template.GetContractTemplateByTemplateId(contractDetail.TemplateId)
 	if err != nil {
 		return
@@ -1124,12 +1140,12 @@ func GenerateWordV2(contractDetail *contract.ContractDetail, wordPath string) (e
 				title = "依照《【弘则研究】私募客户客户服务列表2021》中"
 			}
 			TableDataListSlice := make([]TableData, 0)
-			//for i := len(contractDetail.Service) - 1; i >= 0; i-- {
-			for i := 0; i < len(contractDetail.Service); i++ {
+			//for i := len(contractServiceAndDetailList) - 1; i >= 0; i-- {
+			for i := 0; i < len(contractServiceAndDetailList); i++ {
 				//表格数据
 				var tableDataList TableData
 
-				item := contractDetail.Service[i]
+				item := contractServiceAndDetailList[i]
 				//表头备注信息
 				tableTitleSlice = append(tableTitleSlice, item.Title)
 				//表格数据
@@ -1322,11 +1338,11 @@ func GenerateWordV2(contractDetail *contract.ContractDetail, wordPath string) (e
 					title = "依照《【弘则研究】私募客户客户服务列表2021》中 "
 				}
 				TableDataListSlice := make([]TableData, 0)
-				for i := len(contractDetail.Service) - 1; i >= 0; i-- {
+				for i := len(contractServiceAndDetailList) - 1; i >= 0; i-- {
 					//表格数据
 					var tableDataList TableData
 
-					item := contractDetail.Service[i]
+					item := contractServiceAndDetailList[i]
 					//表头备注信息
 					tableTitleSlice = append(tableTitleSlice, item.Title)
 					//表格数据