Browse Source

Merge remote-tracking branch 'origin/crm1.0' into debug

Roc 3 years ago
parent
commit
2057293700

+ 1 - 0
models/custom/contract/contract_service.go

@@ -27,6 +27,7 @@ type ContractServiceAndDetail struct {
 	Title             string `description:"套餐标题"`
 	Title             string `description:"套餐标题"`
 	Value             string `description:"套餐的值"`
 	Value             string `description:"套餐的值"`
 	HasDetail         string `description:"是否有详情,枚举值:是、否;默认:否"`
 	HasDetail         string `description:"是否有详情,枚举值:是、否;默认:否"`
+	ChartPermissionId int    `description:"权限id"`
 	DetailList        []*contract_service_detail.ContractServiceDetail
 	DetailList        []*contract_service_detail.ContractServiceDetail
 }
 }
 
 

+ 3 - 0
models/tables/contract/contract.go

@@ -3,6 +3,7 @@ package contract
 import (
 import (
 	"fmt"
 	"fmt"
 	"hongze/hongze_mobile_admin/models/custom/contract"
 	"hongze/hongze_mobile_admin/models/custom/contract"
+	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
 	"hongze/hongze_mobile_admin/utils"
 	"hongze/hongze_mobile_admin/utils"
 	"rdluck_tools/orm"
 	"rdluck_tools/orm"
 	"time"
 	"time"
@@ -116,6 +117,8 @@ type ContractDetail struct {
 	CheckBackFileTimeStr string `description:"合同签回时间"`
 	CheckBackFileTimeStr string `description:"合同签回时间"`
 	RescindTimeStr       string `description:"解约时间"`
 	RescindTimeStr       string `description:"解约时间"`
 	Service              []*contract.ContractServiceAndDetail
 	Service              []*contract.ContractServiceAndDetail
+
+	PermissionLookList []*company_report_permission.PermissionLookList `description:"合同里面的权限列表"`
 }
 }
 
 
 //根据合同id获取合同详情信息
 //根据合同id获取合同详情信息

+ 161 - 5
services/contract/contract.go

@@ -1,22 +1,26 @@
 package contract
 package contract
 
 
 import (
 import (
+	"encoding/json"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
 	"hongze/hongze_mobile_admin/models/custom"
 	"hongze/hongze_mobile_admin/models/custom"
 	contractCustom "hongze/hongze_mobile_admin/models/custom/contract"
 	contractCustom "hongze/hongze_mobile_admin/models/custom/contract"
+	contractReq "hongze/hongze_mobile_admin/models/request/contract"
 	contractResp "hongze/hongze_mobile_admin/models/response/contract"
 	contractResp "hongze/hongze_mobile_admin/models/response/contract"
+	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
 	"hongze/hongze_mobile_admin/models/tables/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval"
 	"hongze/hongze_mobile_admin/models/tables/contract_approval_record"
 	"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_operation_record"
 	"hongze/hongze_mobile_admin/models/tables/contract_service_detail"
 	"hongze/hongze_mobile_admin/models/tables/contract_service_detail"
 	"hongze/hongze_mobile_admin/utils"
 	"hongze/hongze_mobile_admin/utils"
+	"reflect"
 	"strings"
 	"strings"
 	"time"
 	"time"
 )
 )
 
 
-//作废合同
+// InvalidContract 作废合同
 func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) {
 func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) {
 	//查询当前合同信息
 	//查询当前合同信息
 	nowContract, err := contract.GetContractById(contractId)
 	nowContract, err := contract.GetContractById(contractId)
@@ -52,7 +56,7 @@ func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) {
 	return
 	return
 }
 }
 
 
-//根据id获取合同详情(包含服务)
+// GetContractDetail 根据id获取合同详情(包含服务)
 func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
 func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
 	contractDetail, err = contract.GetContractDetailById(contractId)
 	contractDetail, err = contract.GetContractDetailById(contractId)
 	if err != nil {
 	if err != nil {
@@ -80,7 +84,7 @@ func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail,
 	return
 	return
 }
 }
 
 
-//上传签回合同附件
+// UploadCheckBackFile 上传签回合同附件
 func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx) (err error) {
 func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx) (err error) {
 	//获取合同信息
 	//获取合同信息
 	contractInfo, err := contract.GetContractById(contractId)
 	contractInfo, err := contract.GetContractById(contractId)
@@ -107,7 +111,7 @@ func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx)
 	return
 	return
 }
 }
 
 
-//获取审批流和权限
+// GetOpButton 获取审批流和权限
 func GetOpButton(contractInfo *contract.ContractDetail, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (contractOpButton contractResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
 func GetOpButton(contractInfo *contract.ContractDetail, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (contractOpButton contractResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
 	//审批流
 	//审批流
 	approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
 	approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
@@ -151,7 +155,7 @@ func GetOpButton(contractInfo *contract.ContractDetail, contractApprovalInfo *co
 	return
 	return
 }
 }
 
 
-//根据合同获取合同详情
+// GetContractDetailByContractId 根据合同获取合同详情
 func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (contractInfo *contract.ContractDetail, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, opButton contractResp.OpButton, err error) {
 func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (contractInfo *contract.ContractDetail, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, opButton contractResp.OpButton, err error) {
 	contractInfo, err = GetContractDetail(contractId)
 	contractInfo, err = GetContractDetail(contractId)
 	if err != nil {
 	if err != nil {
@@ -164,6 +168,10 @@ func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (cont
 	contractInfo.ModifyTimeStr = contractInfo.ModifyTime.Format(utils.FormatDateTime)
 	contractInfo.ModifyTimeStr = contractInfo.ModifyTime.Format(utils.FormatDateTime)
 	contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime)
 	contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime)
 
 
+	//合同中包含的产品权限
+	permissionLookList, _ := GetPermissionByContractService(contractInfo.ProductId, contractInfo.Service)
+	contractInfo.PermissionLookList = permissionLookList
+
 	//查询最近一次审批单信息
 	//查询最近一次审批单信息
 	lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")
 	lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")
 	if err != nil {
 	if err != nil {
@@ -185,3 +193,151 @@ func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (cont
 	}
 	}
 	return
 	return
 }
 }
+
+// GetProductCelData 获取品种列数据(因为前端可以随意插入列数据,所以需要根据列名来搜索对应的品种列)
+func GetProductCelData(detail contract_service_detail.ContractServiceDetail, tableCel *contractReq.AddContractServiceDetailReq) (err error) {
+	t := reflect.TypeOf(detail)
+	v := reflect.ValueOf(detail)
+	for k := 0; k < t.NumField(); k++ {
+		//获取结构体的参数名
+		tmpName := t.Field(k).Name
+		if strings.Contains(tmpName, "Col") {
+			//获取结构体该参数名的值
+			tmpValue := v.Field(k).String()
+			//如果值不为空的话,那么做下json转换
+			if tmpValue != "" {
+				tmpErr := json.Unmarshal([]byte(tmpValue), tableCel)
+				if tmpErr != nil {
+					err = tmpErr
+					continue
+				}
+				if tableCel.HeadName == "品种" {
+					err = nil
+					return
+				}
+			}
+		}
+	}
+
+	return
+}
+
+// GetPermissionByContractService 通过合同服务,获取权限集合列表
+func GetPermissionByContractService(productId int, serviceList []*contractCustom.ContractServiceAndDetail) (permissionList []*company_report_permission.PermissionLookList, err error) {
+	//子权限切片集合
+	var permissionClassifyArr []string
+	if productId == 1 {
+		for _, v := range utils.PermissionFiccClassifyArr {
+			permissionClassifyArr = append(permissionClassifyArr, v)
+		}
+	} else {
+		permissionClassifyArr = append(permissionClassifyArr, "权益")
+	}
+
+	//获取已经勾选的的权限
+	checkPermissionIdMap, err := GetServicePermissionMap(serviceList)
+	if err != nil {
+		return
+	}
+
+	//遍历获取
+	for _, v := range permissionClassifyArr {
+		checkList := make([]int, 0)
+		plist := new(company_report_permission.PermissionLookList)
+		items, tmpErr := company_report_permission.GetPermissionLookItems(productId, v)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, n := range items {
+			if _, ok := checkPermissionIdMap[n.ChartPermissionId]; ok {
+				checkList = append(checkList, n.ChartPermissionId)
+			}
+		}
+		plist.Items = items
+		plist.ClassifyName = v
+		plist.CheckList = checkList
+
+		permissionList = append(permissionList, plist)
+	}
+	return
+}
+
+// GetServicePermissionMap 获取合同服务中的权限id  map
+func GetServicePermissionMap(serviceList []*contractCustom.ContractServiceAndDetail) (checkPermissionIdMap map[int]int, err error) {
+	checkPermissionIdMap = make(map[int]int)
+
+	//获取已经勾选的的权限
+	for _, contractService := range serviceList {
+		//如果是权益,那么研选必要
+		if contractService.ProductId == 2 {
+			chartPermissionId := 31 //研 选服务
+			checkPermissionIdMap[chartPermissionId] = chartPermissionId
+		}
+
+		//看看系统中有没有映射对应的权限,如果有的话,那么直接返回,没有那么可能是特殊服务,需要去遍历
+		if contractService.ChartPermissionId > 0 {
+			checkPermissionIdMap[contractService.ChartPermissionId] = contractService.ChartPermissionId
+			continue
+		}
+		switch contractService.ServiceTemplateId {
+		case 1: //ficc 大套餐
+			for _, v := range utils.PermissionFiccClassifyArr {
+				//大套餐中 市场策略暂时不作为勾选项
+				if v == "市场策略" {
+					continue
+				}
+				items, tmpErr := company_report_permission.GetPermissionLookItems(1, v)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				for _, n := range items {
+					checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
+				}
+			}
+		case 2: //ficc小套餐
+			permissionValues := []string{
+				"FICC周报", "商品双周报+线上电话会讨论会<br/>(由弘则的研究员主持线上讨论)", "数据点评",
+			}
+			for _, detail := range contractService.DetailList {
+				var tableCel contractReq.AddContractServiceDetailReq
+				tmpErr := json.Unmarshal([]byte(detail.Col1), &tableCel)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				if strings.Contains(strings.Join(permissionValues, ","), tableCel.Value) {
+					//获取品种列数据
+					var tableCel2 contractReq.AddContractServiceDetailReq
+					tmpErr := GetProductCelData(*detail, &tableCel2)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+					for _, serviceId := range tableCel2.ValueId {
+						checkPermissionIdMap[serviceId] = serviceId
+					}
+				}
+			}
+		case 4, 5, 6: //权益大套餐
+			permissionFiccClassifyArr := []string{"权益"}
+			for _, v := range permissionFiccClassifyArr {
+				items, tmpErr := company_report_permission.GetPermissionLookItems(2, v)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				for _, n := range items {
+					//如果是专家行业,那么 结束当前循环,进入下一循环(产品需求:专家行业不在里面)
+					if n.ChartPermissionId == 29 {
+						continue
+					}
+					checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
+				}
+			}
+		}
+
+	}
+	return
+}

+ 4 - 2
services/contract/contract_approval.go

@@ -718,10 +718,12 @@ func AfterApproved(contractId int) (err error) {
 		defer os.Remove(pdfPath)
 		defer os.Remove(pdfPath)
 
 
 		//randStr := utils.GetRandStringNoSpecialChar(28)
 		//randStr := utils.GetRandStringNoSpecialChar(28)
-		fileName := contractDetail.ContractCode + ".pdf"
+		//fileName := contractDetail.ContractCode + ".pdf"
+		fileName := contractDetail.CompanyName + "_" + contractDetail.ContractCode + ".pdf"
 		//非正式环境下,文件名上面还是加上随机数
 		//非正式环境下,文件名上面还是加上随机数
 		if utils.RunMode != "release" {
 		if utils.RunMode != "release" {
-			fileName = contractDetail.ContractCode + "_" + utils.GetRandStringNoSpecialChar(10) + ".pdf"
+			//fileName = contractDetail.ContractCode + "_" + utils.GetRandStringNoSpecialChar(10) + ".pdf"
+			fileName = contractDetail.CompanyName + "_" + contractDetail.ContractCode + "_" + utils.GetRandStringNoSpecialChar(10) + ".pdf"
 		}
 		}
 		//上传到阿里云
 		//上传到阿里云
 		resourceUrl, tmpErr := services.UploadAliyun(fileName, pdfPath)
 		resourceUrl, tmpErr := services.UploadAliyun(fileName, pdfPath)

+ 13 - 2
services/word.go

@@ -121,7 +121,7 @@ func GenerateWord(contractDetail *contract.ContractDetail) (err error) {
 				// ClearContent clears both text and line breaks within a run,
 				// ClearContent clears both text and line breaks within a run,
 				// so we need to add the line break back
 				// so we need to add the line break back
 				r.ClearContent()
 				r.ClearContent()
-				address := contractDetail.Province + contractDetail.City + contractDetail.Address
+				address := getContractAddress(contractDetail)
 				r.AddText(address)
 				r.AddText(address)
 				//r.AddBreak()
 				//r.AddBreak()
 
 
@@ -529,7 +529,7 @@ func GetHtmlByContractDetail(contractDetail *contract.ContractDetail, htmlType s
 	myTpl := template.Must(template.New("contract").Parse(htmlTpl))
 	myTpl := template.Must(template.New("contract").Parse(htmlTpl))
 
 
 	//地址
 	//地址
-	address := contractDetail.Province + contractDetail.City + contractDetail.Address
+	address := getContractAddress(contractDetail)
 	data := html2pdfData{
 	data := html2pdfData{
 		CompanyName:     contractDetail.CompanyName,
 		CompanyName:     contractDetail.CompanyName,
 		ContractCode:    contractDetail.ContractCode,
 		ContractCode:    contractDetail.ContractCode,
@@ -1055,3 +1055,14 @@ func getColList(item *contract_service_detail.ContractServiceDetail) (cellList [
 	}
 	}
 	return
 	return
 }
 }
+
+// getContractAddress 获取展示的详细地址
+func getContractAddress(contractDetail *contract.ContractDetail) (address string) {
+	ignoreStrs := []string{"北京市", "上海市", "天津市", "重庆市"}
+	if strings.Contains(strings.Join(ignoreStrs, ","), contractDetail.Province) {
+		address = contractDetail.City + contractDetail.Address
+	} else {
+		address = contractDetail.Province + contractDetail.City + contractDetail.Address
+	}
+	return
+}