package cygx import ( "encoding/json" "github.com/rdlucklib/rdluck_tools/paging" "github.com/tealeg/xlsx" "hongze/hz_crm_api/controllers" "hongze/hz_crm_api/models" "hongze/hz_crm_api/models/cygx" "hongze/hz_crm_api/models/system" cygxService "hongze/hz_crm_api/services/cygx" "hongze/hz_crm_api/utils" "os" "path/filepath" "strconv" "strings" "time" ) // 产品内测 type ProductInteriorController struct { controllers.BaseAuthController } // @Title 新增 // @Description 新增产品内测接口 // @Param request body cygx.AddProductInteriorReq true "type json string" // @Success 200 {object} "保存成功" // @router /productInterior/preserveAndPublish [post] func (this *ProductInteriorController) PreserveAndPublish() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } var req cygx.AddProductInteriorReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } publishTime := utils.StrDateToDate(req.PublishTime) //时间字符串格式转时间格式 productInteriorId := req.ProductInteriorId columnName := req.ColumnName title := req.Title abstract := req.Abstract department := req.Department body := req.Body industrialManagementIds := req.IndustrialManagementIds industrialSubjectIds := req.IndustrialSubjectIds matchTypeId := req.MatchTypeId chartPermissionId := req.ChartPermissionId // 产业ID校验 if industrialManagementIds != "" { industrialManagementIdList := strings.Split(industrialManagementIds, ",") for _, v := range industrialManagementIdList { _, err := strconv.Atoi(v) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "产业ID不规范,Err:" + err.Error() + industrialManagementIds return } } } if industrialSubjectIds != "" { industrialSubjectIdList := strings.Split(industrialSubjectIds, ",") for _, v := range industrialSubjectIdList { _, err := strconv.Atoi(v) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "标的ID不规范,Err:" + err.Error() + industrialSubjectIds return } } } charInfo, errCategory := cygx.GetCategoryInfoById(chartPermissionId) if errCategory != nil { br.Msg = "获取品种信息失败" br.ErrMsg = "获取品种信息失败,Err:" + errCategory.Error() return } item := new(cygx.CygxProductInterior) item.Status = req.DoType item.ColumnName = columnName item.Title = title item.PublishTime = publishTime item.CreateTime = time.Now() item.ModifyTime = time.Now() item.Body = body item.Abstract = abstract item.Department = department item.AdminId = sysUser.AdminId item.MatchTypeId = matchTypeId item.ChartPermissionId = chartPermissionId item.ChartPermissionName = charInfo.PermissionName if req.DoType == 1 { item.IsCancel = 0 } if productInteriorId == 0 { //新增 err = cygx.AddProductInterior(item, industrialManagementIds, industrialSubjectIds) } else { //更新 detail, err := cygx.GetCygxProductInteriorDetail(productInteriorId) if err != nil { br.Msg = "详情不存在" br.ErrMsg = "获取失败,Err:" + err.Error() return } if req.DoType == 1 { item.Status = 1 item.IsCancel = 0 } else { item.IsCancel = detail.IsCancel item.Status = detail.Status } item.ProductInteriorId = productInteriorId item.VisibleRange = detail.VisibleRange err = cygx.UpdateProductInterior(item, industrialManagementIds, industrialSubjectIds) } if err != nil { br.Msg = "保存失败" br.ErrMsg = "保存失败,Err:" + err.Error() return } go cygxService.UpdateProductInteriorResourceData(productInteriorId) //写入首页最新 cygx_resource_data 表 br.Ret = 200 br.Success = true br.IsAddLog = true br.Msg = "操作成功" } // @Title 列表 // @Description 列表接口 // @Param PageSize query int true "每页数据条数" // @Param CurrentIndex query int true "当前页页码,从1开始" // @Param Status query int false "发布状态 ,0未发布,1已发布,传2查询所有" // @Param StartDate query string false "开始时间 ,列如2021-03-06 " // @Param EndDate query string false "结束时间,列如2021-03-06 " // @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp // @router /productInterior/list [get] func (this *ProductInteriorController) List() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() sysUser := this.SysUser if sysUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,SysUser Is Empty" br.Ret = 408 return } resp := new(cygx.GetCygxProductInteriorResp) pageSize, _ := this.GetInt("PageSize") currentIndex, _ := this.GetInt("CurrentIndex") status, _ := this.GetInt("Status") startDate := this.GetString("StartDate") endDate := this.GetString("EndDate") var startSize int if pageSize <= 0 { pageSize = utils.PageSize20 } if currentIndex <= 0 { currentIndex = 1 } startSize = utils.StartIndex(currentIndex, pageSize) var condition string var pars []interface{} if status == 0 || status == 1 { condition += ` AND art.status = ? ` pars = append(pars, status) } if startDate != "" && endDate != "" { condition += ` AND art.publish_time BETWEEN ? AND ? ` pars = append(pars, startDate, endDate) } total, err := cygx.GetCygxProductInteriorCount(condition, pars) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } condition += " ORDER BY art.publish_time DESC , art.product_interior_id DESC " list, err := cygx.GetCygxProductInteriorList(condition, pars, startSize, pageSize) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } var productInteriorIds []int for _, v := range list { v.PublishTime = utils.TimeRemoveHms(v.PublishTime) if v.IsCancel == 1 { v.Status = 3 } productInteriorIds = append(productInteriorIds, v.ProductInteriorId) } //获取pv/Uv map mapPv, mapUv := cygxService.GetCygxProductInteriorHistoryListMap(productInteriorIds) //mapMsg := cygxService.GetCygxProductInteriorMsgListMap(productInteriorIds) // 留言数据 mapLabel := cygxService.GetCygxProductInteriorLabelListMap(productInteriorIds) // 标签 mapMatchTypeName := cygxService.GetCygxReportMappingCygxListMap() //报告匹配类型 for _, v := range list { v.Pv = mapPv[v.ProductInteriorId] v.Uv = mapUv[v.ProductInteriorId] v.Label = mapLabel[v.ProductInteriorId] v.MatchTypeName = mapMatchTypeName[v.MatchTypeId] } page := paging.GetPaging(currentIndex, pageSize, total) resp.List = list resp.Paging = page br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // @Title 详情 // @Description 获取详情接口 // @Param ProductInteriorId query int true "ID" // @Success Ret=200 {object} cygx.GetCygxProductInteriorDetailResp // @router /productInterior/detail [get] func (this *ProductInteriorController) Detail() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() AdminUser := this.SysUser if AdminUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,用户信息为空" br.Ret = 408 return } resp := new(cygx.GetCygxProductInteriorDetailResp) productInteriorId, _ := this.GetInt("ProductInteriorId") if productInteriorId < 1 { br.Msg = "请输入详情ID" return } detail, err := cygx.GetCygxProductInteriorDetail(productInteriorId) if err != nil { br.Msg = "详情不存在" br.ErrMsg = "获取失败,Err:" + err.Error() return } detail.PublishTime = utils.TimeRemoveHms2(detail.PublishTime) industrialList, err := cygx.GetProductInteriorIndustrialGroupManagementList(productInteriorId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取信息失败" br.ErrMsg = "GetProductInteriorIndustrialGroupManagementList,Err:" + err.Error() + "productInteriorId:" + strconv.Itoa(productInteriorId) return } subjectList, err := cygx.GetProductInteriorIndustrialGroupSubjecttList(productInteriorId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取信息失败" br.ErrMsg = "GetProductInteriorIndustrialGroupSubjecttList,Err:" + err.Error() + "productInteriorId:" + strconv.Itoa(productInteriorId) return } if detail.MatchTypeId > 0 { matchDetail, err := cygx.GetCygxReportMappingCygxDetail(detail.MatchTypeId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "GetCygxReportMappingCygxDetail,Err:" + err.Error() return } if matchDetail != nil { detail.MatchTypeName = matchDetail.MatchTypeName } } detail.ListIndustrial = industrialList detail.ListSubject = subjectList resp.Detail = detail br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // @Title 删除 // @Description 获取详情接口 // @Param request body cygx.TacticsTimeLineTimeLineIdReq true "type json string" // @Success 200 {object} "操作成功" // @router /productInterior/delete [POST] func (this *ProductInteriorController) Delete() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() AdminUser := this.SysUser if AdminUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,用户信息为空" br.Ret = 408 return } var req cygx.ProductInteriorIdReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } productInteriorId := req.ProductInteriorId if productInteriorId == 0 { br.Msg = "参数错误" br.ErrMsg = "参数错误,id不可为空" return } err = cygx.DeleteProductInterior(productInteriorId) if err != nil { br.Msg = "详情不存在" br.ErrMsg = "获取失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.IsAddLog = true br.Msg = "删除成功" } // @Title 发布/取消发布报告 // @Description 发布/取消发布报告接口 // @Param request body cygx.ProductInteriorIdReq true "type json string" // @Success 200 Ret=200 发布成功 // @router /productInterior/publishAndcancel [post] func (this *ProductInteriorController) PublishReport() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req cygx.ProductInteriorIdReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } productInteriorId := req.ProductInteriorId if productInteriorId == 0 { br.Msg = "参数错误" br.ErrMsg = "参数错误,id不可为空" return } detail, err := cygx.GetCygxProductInteriorDetail(productInteriorId) if err != nil { br.Msg = "详情不存在" br.ErrMsg = "获取失败,Err:" + err.Error() return } var status int var isCancel int if detail.Status == 0 { status = 1 isCancel = 0 } else { status = 0 isCancel = 1 //go cygxService.UpdateResourceData(productInteriorId, "productinterior", "delete", time.Now().Format(utils.FormatDateTime)) go cygxService.UpdateProductInteriorResourceData(productInteriorId) //写入首页最新 cygx_resource_data 表 } err = cygx.EditProductInteriorStatus(status, isCancel, productInteriorId) if err != nil { br.Msg = "操作失败" br.ErrMsg = "获取失败,Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "操作成功" } // @Title 可见范围修改 // @Description 可见范围修改接口 // @Param request body cygx.ProductInteriorIdReq true "type json string" // @Success 200 操作成功 // @router /productInterior/visibleRange [post] func (this *ProductInteriorController) VisibleRange() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() AdminUser := this.SysUser if AdminUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,用户信息为空" br.Ret = 408 return } var req cygx.ProductInteriorIdReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } productInteriorId := req.ProductInteriorId detail, err := cygx.GetCygxProductInteriorDetail(productInteriorId) if err != nil { br.Msg = "详情不存在" br.ErrMsg = "获取失败,Err:" + err.Error() return } var visibleRange int if detail.VisibleRange == 0 { visibleRange = 1 //go cygxService.UpdateResourceData(productInteriorId, "productinterior", "add", time.Now().Format(utils.FormatDateTime)) go cygxService.SendWxMsgWithCygxProductInterior(productInteriorId) } else { visibleRange = 0 //go cygxService.UpdateResourceData(productInteriorId, "productinterior", "delete", time.Now().Format(utils.FormatDateTime)) } err = cygx.ProductInteriorVisibleRange(visibleRange, productInteriorId) if err != nil { br.Msg = "操作失败" br.ErrMsg = "操作失败,Err:" + err.Error() return } go cygxService.UpdateProductInteriorResourceData(productInteriorId) //写入首页最新 cygx_resource_data 表 br.Ret = 200 br.Success = true br.Msg = "操作成功" br.IsAddLog = true } // @Title 下载PV // @Description 下载PV接口 // @Param ProductInteriorId query int true "ID" // @router /productInterior/PvExport [get] func (this *ProductInteriorController) PvExport() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() AdminUser := this.SysUser if AdminUser == nil { br.Msg = "请登录" br.ErrMsg = "请登录,用户信息为空" br.Ret = 408 return } productInteriorId, _ := this.GetInt("ProductInteriorId") if productInteriorId < 1 { br.Msg = "请输入详情ID" return } var condition string var pars []interface{} condition = ` AND product_interior_id = ? ` pars = append(pars, productInteriorId) var respList []*cygx.CygxProductInteriorHistory list, err := cygx.GetCygxProductInteriorHistoryList(condition, pars) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取数据失败,Err:" + err.Error() return } //超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户 resp := new(cygx.CanDownload) adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId) if errAdmin != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,Err:" + errAdmin.Error() return } if adminInfo.Role == "admin" || adminInfo.Role == "researcher" { resp.IsCanDownload = true } //销售查看自己客户,销售组长查看组员 if resp.IsCanDownload == false { mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo) if err != nil { br.Msg = "获取失败" br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error() return } for _, v := range list { if _, ok := mapMobile[v.Mobile]; ok { respList = append(respList, v) } } } else { respList = list } //创建excel dir, err := os.Executable() exPath := filepath.Dir(dir) downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx" xlsxFile := xlsx.NewFile() if err != nil { br.Msg = "生成文件失败" br.ErrMsg = "生成文件失败" return } style := xlsx.NewStyle() alignment := xlsx.Alignment{ Horizontal: "center", Vertical: "center", WrapText: true, } style.Alignment = alignment style.ApplyAlignment = true sheet, err := xlsxFile.AddSheet("阅读明细") if err != nil { br.Msg = "新增Sheet失败" br.ErrMsg = "新增Sheet失败,Err:" + err.Error() return } rowTitle := sheet.AddRow() cellA := rowTitle.AddCell() cellA.Value = "姓名" cellB := rowTitle.AddCell() cellB.Value = "手机号" cellC := rowTitle.AddCell() cellC.Value = "公司名称" cellD := rowTitle.AddCell() cellD.Value = "所属权益销售" cellE := rowTitle.AddCell() cellE.Value = "阅读时间" for _, item := range respList { row := sheet.AddRow() cellA := row.AddCell() cellA.Value = item.RealName cellB := row.AddCell() cellB.Value = item.Mobile cellC := row.AddCell() cellC.Value = item.CompanyName cellD := row.AddCell() cellD.Value = item.SellerName cellE := row.AddCell() cellE.Value = item.CreateTime.Format(utils.FormatDateTime) } err = xlsxFile.Save(downLoadnFilePath) if err != nil { br.Msg = "保存文件失败" br.ErrMsg = "保存文件失败" return } downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx" this.Ctx.Output.Download(downLoadnFilePath, downloadFileName) defer func() { os.Remove(downLoadnFilePath) }() br.Ret = 200 br.Success = true br.Msg = "获取成功" }