ソースを参照

合规登记导入导出

xiexiaoyuan 2 年 前
コミット
4f017e47f0

+ 1 - 1
controller/census/invoice_payment.go

@@ -623,7 +623,7 @@ func (ct *InvoicePaymentController) List(c *gin.Context) {
 				servicesNameMap[contractServiceList[i].ContractRegisterId] = append(servicesNameMap[contractServiceList[i].ContractRegisterId], contractServiceList[i].Title)
 			}
 */
-			servicesNameMap, serviceFormatMap, e := fmsService.GetContractServiceNameFormat(registerIds)
+			servicesNameMap, serviceFormatMap, e := fmsService.GetContractServiceNameFormat(queryRegisterIds)
 			if e != nil {
 				listErr = fmt.Errorf("获取合同套餐列表失败, Err: %s", e.Error())
 				return

+ 84 - 44
controller/contract/register.go

@@ -1010,7 +1010,9 @@ func (rg *RegisterController) Invoice(c *gin.Context) {
 	}
 
 	// todo 判断是否符合均分金额的条件,如果符合,需要生成金额分配记录表
+	if req.InvoiceType == fms.ContractInvoiceTypePay {
 
+	}
 	// 新增的记录
 	if len(newInvoice) > 0 {
 		newAmount := decimal.NewFromFloat(0).Round(2)
@@ -1162,38 +1164,33 @@ func (rg *RegisterController) Export(c *gin.Context) {
 
 
 	// 获取所有权益套餐服务
-	raiServiceList, e := fms.GetContractServiceTemplateMapByProductId(crm.CompanyProductRai)
+	raiServiceList, e := fms.GetContractServiceTemplateAllByProductId(crm.CompanyProductRai)
 	if e != nil {
 		resp.FailData("获取权益套餐服务失败", "Err:"+e.Error(), c)
 		return
 	}
+	raiServiceIdMap := make(map[int]*fms.ContractServiceTemplateItem)
+	for i := range raiServiceList {
+		raiServiceIdMap[raiServiceList[i].ServiceTemplateId] = raiServiceList[i]
+	}
+
 	// 除大小套餐外的其他套餐(下面的导出需要以此动态处理)
 	raiOtherService := make([]*fms.ContractServiceTemplateItem, 0)
-	for i := range raiServiceList {
-		//获取二级套餐
-		secondServiceList, e := fms.GetContractServiceTemplateMapByParentId(raiServiceList[i].ServiceTemplateId)
-		if e != nil {
-			resp.FailData("获取二级权益套餐服务失败", "Err:"+e.Error(), c)
-			return
-		}
-		if len(secondServiceList) > 0 {
-			for _, sv := range secondServiceList {
-				//获取三级套餐
-				thirdServiceList, e := fms.GetContractServiceTemplateMapByParentId(sv.ServiceTemplateId)
-				if e != nil {
-					resp.FailData("获取三级权益套餐服务失败", "Err:"+e.Error(), c)
-					return
-				}
-				if len(thirdServiceList) > 0 {
-					for _, tv := range thirdServiceList {
-						raiOtherService = append(raiOtherService, tv)
-					}
-				}else{
-					raiOtherService = append(raiOtherService, sv)
-				}
+	raiServiceNotShowMap := make(map[int]struct{})
+	for _, v := range raiServiceList {
+		if v.Pid > 0 && raiServiceIdMap[v.Pid].Pid > 0 {
+			raiServiceNotShowMap[v.Pid] = struct{}{}
+			raiServiceNotShowMap[raiServiceIdMap[v.Pid].Pid] = struct{}{}
+		}else if v.Pid > 0 {
+			raiServiceNotShowMap[v.Pid] = struct{}{}
+		}
+	}
+	for _, v := range raiServiceList {
+		if _, ok := raiServiceNotShowMap[v.ServiceTemplateId]; !ok {
+			if v.Pid > 0 {
+				v.ParentTitle = raiServiceIdMap[v.Pid].Title
 			}
-		}else{
-			raiOtherService = append(raiOtherService, raiServiceList[i])
+			raiOtherService = append(raiOtherService, v)
 		}
 	}
 	otherServiceLen += len(raiOtherService)
@@ -1202,7 +1199,7 @@ func (rg *RegisterController) Export(c *gin.Context) {
 	serviceAmountMap := make(map[int]map[int]*fms.ContractServiceAmount)
 
 	// 套餐/开票/到款列表
-	serviceMap := make(map[int][]*fms.ContractService)
+	serviceMap := make(map[int][]*fms.ContractServiceWithParentTitle)
 	serviceChartPermissionsMap := make(map[int][]int)
 	invoiceMap := make(map[int][]*fms.ContractInvoice)
 	paymentMap := make(map[int][]*fms.ContractInvoice)
@@ -1210,11 +1207,11 @@ func (rg *RegisterController) Export(c *gin.Context) {
 	maxPayment := 0
 	if len(registerIds) > 0 {
 		// 获取套餐信息
-		csCond := `contract_register_id IN ?`
+		csCond := `cv.contract_register_id IN ?`
 		csPars := make([]interface{}, 0)
 		csPars = append(csPars, registerIds)
 		cs := new(fms.ContractService)
-		serviceList, e := cs.List(csCond, csPars)
+		serviceList, e := cs.ListWithWithParentTitle(csCond, csPars)
 		if e != nil {
 			resp.FailData("获取合同套餐列表失败", "Err:"+e.Error(), c)
 			return
@@ -1222,7 +1219,7 @@ func (rg *RegisterController) Export(c *gin.Context) {
 		for i := range serviceList {
 			cid := serviceList[i].ContractRegisterId
 			if serviceMap[cid] == nil {
-				serviceMap[cid] = make([]*fms.ContractService, 0)
+				serviceMap[cid] = make([]*fms.ContractServiceWithParentTitle, 0)
 			}
 			serviceMap[cid] = append(serviceMap[cid], serviceList[i])
 			// 小套餐权限
@@ -1249,6 +1246,9 @@ func (rg *RegisterController) Export(c *gin.Context) {
 		}
 		// 获取开票/到款详情, 并取最大的开票/到款数(用于动态扩展第二列表头)
 		ci := new(fms.ContractInvoice)
+		csCond = `contract_register_id IN ?`
+		csPars = make([]interface{}, 0)
+		csPars = append(csPars, registerIds)
 		invoiceList, e := ci.List(csCond, csPars, "")
 		if e != nil {
 			resp.FailData("获取开票/到款列表失败", "Err:"+e.Error(), c)
@@ -1284,6 +1284,10 @@ func (rg *RegisterController) Export(c *gin.Context) {
 		}
 	}
 
+	serviceProductIdMap := map[int]string{
+		1:"FICC套餐",
+		2:"权益套餐",
+	}
 	// 生成Excel文件
 	xlsxFile := xlsx.NewFile()
 	style := xlsx.NewStyle()
@@ -1409,6 +1413,7 @@ func (rg *RegisterController) Export(c *gin.Context) {
 	titleRow3 := sheet.AddRow()
 	titleRow3.SetHeight(60)
 	row3Title := make([]string, 0)
+	row3TitleParent := make([]string, 0)
 	row3Title = append(row3Title, "客户名称", "新客户\n0-是\n1-否", "合同类型\n续约-0\n新增-1\n代付-2\n补充协议-3", "FICC销售", "权益销售", "FICC大套餐")
 	for i := range permissionList {
 		row3Title = append(row3Title, permissionList[i].PermissionName)
@@ -1418,9 +1423,18 @@ func (rg *RegisterController) Export(c *gin.Context) {
 	for i := range otherService {
 		row3Title = append(row3Title, otherService[i].Title)
 	}
+	// 定义二级套餐名称
+	for i:= range row3Title {
+		row3TitleParent = append(row3TitleParent, row3Title[i])
+	}
 	// 权益三级套餐
 	for i := range raiOtherService {
 		row3Title = append(row3Title, raiOtherService[i].Title)
+		if raiOtherService[i].ParentTitle != "" {
+			row3TitleParent = append(row3TitleParent, raiOtherService[i].ParentTitle)
+		}else{
+			row3TitleParent = append(row3TitleParent, raiOtherService[i].Title)
+		}
 	}
 
 	row3Title = append(row3Title, "套餐备注", "开始时间", "到期时间", "2022年合同金额", "金额单位", "FICC套餐总金额", "权益套餐总金额", "约定付款时间", "签订日", "合同状态",
@@ -1449,7 +1463,7 @@ func (rg *RegisterController) Export(c *gin.Context) {
 	for i := 0; i < maxPayment; i++ {
 		n := i + 1
 		for ii := range paymentTitle {
-			c := titleRow2.AddCell()
+			c := titleRow3.AddCell()
 			t := fmt.Sprintf("%s%d", paymentTitle[ii], n)
 			c.SetString(t)
 			c.SetStyle(style)
@@ -1488,7 +1502,6 @@ func (rg *RegisterController) Export(c *gin.Context) {
 		if svList != nil && len(svList) > 0 {
 			for isv := range svList {
 				if svList[isv].Title == col4Name {
-					// todo 判断权益套餐权限时会有问题,需要同时判断父级name
 					col4 = "是"
 					break
 				}
@@ -1517,8 +1530,16 @@ func (rg *RegisterController) Export(c *gin.Context) {
 			if svList != nil && len(svList) > 0 {
 				for isv := range svList {
 					if svList[isv].Title == otherColName {
-						otherCol = "是"
-						break
+						// 判断权益套餐权限时,需要同时判断父级name
+						if otherColName == "主观" || otherColName == "客观" {
+							if row3TitleParent[k] == svList[isv].ParentTitle {
+								otherCol = "是"
+								break
+							}
+						}else{
+							otherCol = "是"
+							break
+						}
 					}
 				}
 			}
@@ -1549,8 +1570,7 @@ func (rg *RegisterController) Export(c *gin.Context) {
 				if ivList != nil && ivList[ia] != nil {
 					dataRow.AddCell().SetString(utils.TimeTransferString("2006/01/02", ivList[ia].InvoiceDate)) // 开票日
 					dataRow.AddCell().SetString(fmt.Sprint(ivList[ia].OriginAmount))                            // 开票金额
-					// todo 开票中的套餐类型
-					dataRow.AddCell().SetString("")
+					dataRow.AddCell().SetString(serviceProductIdMap[ivList[ia].ServiceProductId])             // 套餐类型
 					dataRow.AddCell().SetString(ivList[ia].SellerName)                                          // 销售名称
 					dataRow.AddCell().SetString(ivList[ia].Remark)                                              // 开票备注
 					continue
@@ -1570,8 +1590,7 @@ func (rg *RegisterController) Export(c *gin.Context) {
 				if pyList != nil && pyList[ib] != nil {
 					dataRow.AddCell().SetString(utils.TimeTransferString("2006/01/02", pyList[ib].InvoiceDate)) // 收款日
 					dataRow.AddCell().SetString(fmt.Sprint(pyList[ib].OriginAmount))                            // 收款金额
-					//todo 到款的套餐类型
-					dataRow.AddCell().SetString("")                                                          // 套餐类型
+					dataRow.AddCell().SetString(serviceProductIdMap[pyList[ib].ServiceProductId])            // 套餐类型
 					dataRow.AddCell().SetString(pyList[ib].Remark)                                              // 收款备注
 					continue
 				}
@@ -1665,6 +1684,13 @@ func (rg *RegisterController) InvoiceList(c *gin.Context) {
 		pars = append(pars, req.ServiceProductId)
 	}
 
+	// 销售
+	if req.SellerIds != "" {
+		sellerIds := strings.Split(req.SellerIds, ",")
+		cond += ` AND (seller_id in (?))`
+		pars = append(pars, sellerIds)
+	}
+
 	// 货币列表
 	currencyOB := new(fms.CurrencyUnit)
 	currencyCond := `enable = 1`
@@ -2184,7 +2210,6 @@ func (rg *RegisterController) Import(c *gin.Context) {
 						}
 						continue
 					}
-					// todo 权益行业套餐
 					if k >=34 && k<=44 {
 						if v == "是" {
 							// 权益大套餐
@@ -2376,7 +2401,7 @@ func (rg *RegisterController) Import(c *gin.Context) {
 						rowRegister.RMBRate = rate
 						continue
 					}
-					// todo FICC套餐总金额
+					// FICC 套餐总金额
 					if k == 55 {
 						amountStr := v
 						amount, e := strconv.ParseFloat(amountStr, 64)
@@ -2395,7 +2420,7 @@ func (rg *RegisterController) Import(c *gin.Context) {
 						}
 						continue
 					}
-					// todo 权益套餐总金额
+					// 权益套餐总金额
 					if k == 56 {
 						amountStr := v
 						amount, e := strconv.ParseFloat(amountStr, 64)
@@ -2471,7 +2496,7 @@ func (rg *RegisterController) Import(c *gin.Context) {
 						continue
 					}
 					// 开票列表
-					k2 := 62
+					k2 := 61
 					for ir := 0; ir < invoiceMax; ir++ {
 						n := ir + 1
 						// 开票日
@@ -2518,10 +2543,18 @@ func (rg *RegisterController) Import(c *gin.Context) {
 							}
 							continue
 						}
-						// todo 开票套餐类型
+						// 开票套餐类型
 						k2 += 1
 						if k == k2 {
 							if v != "" {
+								if v == "FICC套餐" {
+									rowInvoices[ir].ServiceProductId = crm.CompanyProductFicc
+								}else if v == "权益套餐"{
+									rowInvoices[ir].ServiceProductId = crm.CompanyProductRai
+								}else{
+									resp.Fail(fmt.Sprintf("第%d行开票套餐类型%d:%s有误, 请按模板导入", i+1, n, v), c)
+									return
+								}
 							}
 							continue
 						}
@@ -2605,11 +2638,18 @@ func (rg *RegisterController) Import(c *gin.Context) {
 							continue
 						}
 
-						// todo 到款套餐类型
+						// 到款套餐类型
 						k2 += 1
 						if k == k2 {
 							if v != "" {
-
+								if v == "FICC套餐" {
+									rowPayments[ir].ServiceProductId = crm.CompanyProductFicc
+								}else if v == "权益套餐"{
+									rowPayments[ir].ServiceProductId = crm.CompanyProductRai
+								}else{
+									resp.Fail(fmt.Sprintf("第%d行到款套餐类型%d:%s有误, 请按模板导入", i+1, n, v), c)
+									return
+								}
 							}
 							continue
 						}

+ 25 - 1
controller/crm/company_seller.go

@@ -2,7 +2,9 @@ package crm
 
 import (
 	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
 	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
 	"hongze/fms_api/models/crm"
 	crmService "hongze/fms_api/services/crm"
 )
@@ -31,10 +33,32 @@ func (rg *CompanySellerController) List(c *gin.Context) {
 // @Success 200 {object} crm.SysGroup
 // @router /crm/company_seller/group_list [get]
 func (rg *CompanySellerController) GroupList(c *gin.Context) {
+	var req crm.SysGroupListReq
+	if e := c.BindQuery(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	var departmentId int
+	if req.SellerType == 1 {
+		departmentId = crm.SellerDepartmentId
+	}else if req.SellerType == 2 {
+		departmentId = crm.RaiSellerDepartmentId
+	}else if req.SellerType == 0 {
+		resp.Fail("请选择销售类型", c)
+		return
+	}else {
+		resp.Fail("请选择正确的销售类型", c)
+		return
+	}
 	groupOB := new(crm.SysGroup)
 	cond := `department_id = ? AND parent_id = 0`
 	pars := make([]interface{}, 0)
-	pars = append(pars, crm.SellerDepartmentId)
+	pars = append(pars, departmentId)
 	list, e := groupOB.List(cond, pars)
 	if e != nil {
 		resp.FailData("获取失败", "获取销售组别列表失败, Err:"+e.Error(), c)

+ 4 - 0
models/crm/sys_group.go

@@ -18,6 +18,10 @@ func (m *SysGroup) TableName() string {
 	return "sys_group"
 }
 
+type SysGroupListReq struct {
+	SellerType int    `json:"seller_type" form:"seller_type" description:"销售类型:1ficc销售,2权益销售"`
+}
+
 func (m *SysGroup) List(condition string, pars []interface{}) (list []*SysGroup, err error) {
 	list = make([]*SysGroup, 0)
 	err = global.MYSQL["report"].Model(m).

+ 2 - 0
models/fms/contract_invoice.go

@@ -207,6 +207,7 @@ func formatContractInvoice2ItemList(list []*ContractInvoice) (itemList []*Contra
 // ContractInvoiceListReq 合同开票/到款登记列表请求体
 type ContractInvoiceListReq struct {
 	InvoiceType      int     `json:"invoice_type" form:"invoice_type" binding:"oneof=1 2" description:"类型: 1-开票登记; 2-到款登记"`
+	SellerIds        string  `json:"seller_ids" form:"seller_ids" description:"销售ID, 多个id用逗号拼接"`
 	ContractCode     string  `json:"contract_code" form:"contract_code" binding:"omitempty" description:"合同编号"`
 	StartDate        string  `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
 	EndDate          string  `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
@@ -253,6 +254,7 @@ func formatContractInvoice2Item(item *ContractInvoice) (formatItem *ContractInvo
 	formatItem.PayType = item.PayType
 	formatItem.Remark = item.Remark
 	formatItem.IsPrePay = item.IsPrePay
+	formatItem.ServiceProductId = item.ServiceProductId
 	formatItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
 	return
 }

+ 0 - 1
models/fms/contract_register.go

@@ -223,7 +223,6 @@ func CreateContractRegisterAndServices(item *ContractRegister, serviceDetail []*
 			HasDetail:          t.HasDetail,
 			ChartPermissionId:  t.ChartPermissionId,
 			ChartPermissionIds: t.ChartPermissionIds,
-			ServiceAmount:      t.ServiceAmount,
 		}
 		contractService.Set()
 		tx.Create(contractService)

+ 17 - 3
models/fms/contract_service.go

@@ -15,13 +15,17 @@ type ContractService struct {
 	Value              string  `gorm:"column:value" json:"value" description:"套餐的值"`
 	TableValue         string  `gorm:"column:table_value" json:"table_value" description:"表格数据,用于word生成时的json数据"`
 	HasDetail          string  `gorm:"column:has_detail" json:"has_detail" description:"是否有详情: 无; 有"`
-	ServiceAmount      float64 `gorm:"column:service_amount" json:"service_amount" description:"套餐总金额"`
-	CurrencyUnit       string  `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
 	ChartPermissionId  int     `gorm:"column:chart_permission_id" json:"chart_permission_id" description:"权限ID"`
 	ChartPermissionIds string  `gorm:"column:chart_permission_ids" json:"chart_permission_ids" description:"权限IDs-小套餐"`
 	base.TimeBase
 }
 
+type ContractServiceWithParentTitle struct {
+	ContractService
+	Pid         int
+	ParentTitle string
+}
+
 func (c *ContractService) TableName() string {
 	return "contract_service"
 }
@@ -34,6 +38,17 @@ func (c *ContractService) List(condition string, pars []interface{}) (list []*Co
 	return
 }
 
+func (c *ContractService) ListWithWithParentTitle(condition string, pars []interface{}) (list []*ContractServiceWithParentTitle, err error) {
+	list = make([]*ContractServiceWithParentTitle, 0)
+	err = global.DEFAULT_MYSQL.Table("contract_service as cv").
+		Select("cv.*, t1.pid, t2.title as parent_title").
+		Joins(" left join contract_service_template as t1 on cv.service_template_id = t1.service_template_id").
+		Joins(" left join contract_service_template as t2 on t1.pid = t2.service_template_id").
+		Where(condition, pars...).
+		Find(&list).Error
+	return
+}
+
 // ContractServiceAddReq 新增合同套餐请求体
 type ContractServiceAddReq struct {
 	ServiceTemplateId  int    `json:"service_template_id" description:"服务套餐id"`
@@ -69,7 +84,6 @@ type ContractServiceAndDetail struct {
 	TableValue         string `json:"table_value" description:"表格数据,用于word生成时的json数据"`
 	ChartPermissionId  int    `json:"chart_permission_id" description:"权限id"`
 	ChartPermissionIds string `json:"chart_permission_ids" description:"品种权限-小套餐"`
-	ServiceAmount      float64 `gorm:"column:service_amount" json:"service_amount" description:"套餐总金额"`
 	//Detail             []*ContractServiceDetail `json:"detail"`
 }
 

+ 10 - 0
models/fms/contract_service_template.go

@@ -39,6 +39,7 @@ type ContractServiceTemplateItem struct {
 	ServiceTemplateId int    `json:"service_template_id" description:"套餐模板ID"`
 	ProductId         int    `json:"product_id" description:"产品ID"`
 	Pid               int    `json:"pid" description:"父级ID"`
+	ParentTitle       string `json:"parent_title" description:"父级套餐名称"`
 	Title             string `json:"title" description:"套餐名称"`
 	Value             string `json:"value" description:"对应的数据"`
 	SelectType        string `json:"select_type" description:"选择器类型:radio-单选; checkbox-多选"`
@@ -84,6 +85,15 @@ func GetContractServiceTemplateMapByProductId(productId int) (items []*ContractS
 	return
 }
 
+func GetContractServiceTemplateAllByProductId(productId int) (items []*ContractServiceTemplateItem, err error) {
+	items = make([]*ContractServiceTemplateItem, 0)
+	err = global.DEFAULT_MYSQL.Table("contract_service_template").
+		Where("product_id = ? AND is_delete = 0", productId).
+		Order("service_template_id ASC").
+		Find(&items).Error
+	return
+}
+
 func GetContractServiceTemplateMapByParentId(parentId int) (items []*ContractServiceTemplateItem, err error) {
 	items = make([]*ContractServiceTemplateItem, 0)
 	err = global.DEFAULT_MYSQL.Table("contract_service_template").

+ 0 - 1
services/fms/contract_register.go

@@ -85,7 +85,6 @@ func HandleContractServiceAndDetail(serviceList []fms.ContractServiceAddReq, bas
 		err = errors.New("请至少选择一种套餐")
 		return
 	}
-	// todo 如果权益套餐中只有行业套餐,需要均分套餐金额,否则无需均分
 	for i := 0; i < len(serviceList); i++ {
 		item := serviceList[i]
 		hasDetail := "否"