contract_allocation.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. package cygx
  2. import (
  3. "fmt"
  4. "github.com/rdlucklib/rdluck_tools/paging"
  5. "hongze/hz_crm_api/controllers"
  6. "hongze/hz_crm_api/models"
  7. "hongze/hz_crm_api/models/company"
  8. "hongze/hz_crm_api/models/contract"
  9. "hongze/hz_crm_api/models/cygx"
  10. "hongze/hz_crm_api/models/system"
  11. contractService "hongze/hz_crm_api/services/contract"
  12. "hongze/hz_crm_api/utils"
  13. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. // ContractAllocationController 权益合同派单
  18. type ContractAllocationController struct {
  19. controllers.BaseAuthController
  20. }
  21. // getQueryParams 获取基础查询信息
  22. func getQueryParams(condition string, pars []interface{}, sysUser *system.Admin, tableAlias string) (newCondition string, newPars []interface{}) {
  23. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
  24. condition += " AND " + tableAlias + "product_id=?"
  25. pars = append(pars, 1)
  26. } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
  27. condition += " AND " + tableAlias + "product_id=?"
  28. pars = append(pars, 2)
  29. } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE {
  30. //超级管理员账户,不做条件限制
  31. } else {
  32. //如果不是研究员,那么去找对应的 部门、小组、销售
  33. if sysUser.Authority == 0 {
  34. //普通用户
  35. condition += " AND " + tableAlias + "seller_id=?"
  36. pars = append(pars, sysUser.AdminId)
  37. } else if sysUser.Authority == 1 {
  38. //部门主管
  39. condition += " AND " + tableAlias + "department_id=?"
  40. pars = append(pars, sysUser.DepartmentId)
  41. } else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
  42. //权益小组负责人
  43. condition += " AND " + tableAlias + "group_id=?"
  44. pars = append(pars, sysUser.GroupId)
  45. } else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
  46. //ficc销售主管
  47. pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
  48. if err != nil {
  49. fmt.Println(err.Error())
  50. return
  51. }
  52. var ids []*string
  53. if pid != nil && *pid != 0 {
  54. ids, err = company.GetGroupIdsByParentId(*pid)
  55. if err != nil {
  56. fmt.Println(err.Error())
  57. }
  58. } else {
  59. ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
  60. if err != nil {
  61. fmt.Println(err.Error())
  62. }
  63. }
  64. var idSlice []string
  65. var sid string
  66. for _, id := range ids {
  67. idSlice = append(idSlice, *id)
  68. }
  69. //加入父级groupId
  70. if *pid > 0 {
  71. idSlice = append(idSlice, strconv.Itoa(*pid))
  72. } else {
  73. idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
  74. }
  75. sid = strings.Join(idSlice, ",")
  76. condition += " AND " + tableAlias + `group_id IN (` + sid + `) `
  77. fmt.Println("condition:", condition)
  78. //pars = append(pars, sysUser.GroupId)
  79. } else if sysUser.Authority == 4 {
  80. //ficc小组负责人
  81. condition += " AND " + tableAlias + "group_id=?"
  82. pars = append(pars, sysUser.GroupId)
  83. } else {
  84. //不知道什么类型的用户(后面新增的位置类型客户)
  85. condition += " AND " + tableAlias + "seller_id=?"
  86. pars = append(pars, sysUser.AdminId)
  87. }
  88. }
  89. newCondition = condition
  90. newPars = pars
  91. return
  92. }
  93. // @Title 合同列表
  94. // @Description 合同列表接口
  95. // @Param PageSize query int true "每页数据条数"
  96. // @Param CurrentIndex query int true "当前页页码,从1开始"
  97. // @Param Keyword query string true "客户名称"
  98. // @Param AdminId query string true "销售id,多个用英文逗号隔开,空字符串为全部"
  99. // @Param StartDate query string false "开始日期"
  100. // @Param EndDate query string false "结束日期"
  101. // @Param ContractType query string false "合同类型,枚举值:“,`新签合同`,`续约合同`,`补充协议`"
  102. // @Param FormalType query string false "转正类型,枚举值:“,`标准`,`非标`"
  103. // @Param IsExport query bool false "是否导出excel,默认是false"
  104. // @Param IsAllocation query int false "派点状态: -1-默认全部; 0-未派点; 1-已派点"
  105. // @Success 200 {object} cygx.CompanyContractListResp
  106. // @router /allocation/company_contract_list [get]
  107. func (this *ContractAllocationController) CompanyContractList() {
  108. br := new(models.BaseResponse).Init()
  109. defer func() {
  110. this.Data["json"] = br
  111. this.ServeJSON()
  112. }()
  113. sysUser := this.SysUser
  114. if sysUser == nil {
  115. br.Msg = "请登录"
  116. br.ErrMsg = "请登录,SysUser Is Empty"
  117. br.Ret = 408
  118. return
  119. }
  120. pageSize, _ := this.GetInt("PageSize")
  121. currentIndex, _ := this.GetInt("CurrentIndex")
  122. adminId := this.GetString("AdminId")
  123. formalType := this.GetString("FormalType")
  124. contractType := this.GetString("ContractType")
  125. keyword := this.GetString("Keyword")
  126. startDate := this.GetString("StartDate")
  127. endDate := this.GetString("EndDate")
  128. isAllocation, _ := this.GetInt("IsAllocation", -1) // CRM 13.9
  129. if startDate == "" {
  130. startDate = "2015-01-01"
  131. }
  132. if endDate == "" {
  133. endDate = time.Now().Format(utils.FormatDate)
  134. }
  135. var startSize int
  136. if pageSize <= 0 {
  137. pageSize = utils.PageSize20
  138. }
  139. if currentIndex <= 0 {
  140. currentIndex = 1
  141. }
  142. startSize = utils.StartIndex(currentIndex, pageSize)
  143. //是否导出报表
  144. isExport, _ := this.GetBool("IsExport")
  145. if isExport {
  146. pageSize = 10000
  147. currentIndex = 1
  148. }
  149. var condition string
  150. var pars []interface{}
  151. //条件
  152. if adminId != "" {
  153. condition += ` AND c.seller_id in (` + adminId + `) `
  154. //pars = append(pars, adminId)
  155. } else {
  156. //根据当前角色来获取查询条件
  157. condition, pars = getQueryParams(condition, pars, sysUser, "c.")
  158. }
  159. //关键字搜索
  160. if keyword != "" {
  161. condition += ` and b.company_name like "%` + keyword + `%" `
  162. }
  163. //是否派点
  164. if isAllocation != -1 {
  165. condition += ` AND a.product_id = ? `
  166. pars = append(pars, isAllocation)
  167. }
  168. // 标准非标查询
  169. switch formalType {
  170. case "标准":
  171. condition += ` AND a.source = ? `
  172. pars = append(pars, "系统合同")
  173. case "非标":
  174. condition += ` AND a.source = ? `
  175. pars = append(pars, "上传附件")
  176. }
  177. if contractType != "" {
  178. condition += ` AND a.contract_type = ? `
  179. pars = append(pars, contractType)
  180. }
  181. //默认只查询权益 2023-06-01 之后的合同
  182. condition += ` AND c.product_id = ? AND a.start_date > ? `
  183. pars = append(pars, 2, "2023-06-01")
  184. var list []*cygx.CompanyContractResp
  185. total, err := cygx.GetCompanyContractCountJoinCompany(condition, pars)
  186. if err != nil && err.Error() != utils.ErrNoRow() {
  187. br.Msg = "获取失败"
  188. br.ErrMsg = "获取失败,Err:" + err.Error()
  189. return
  190. }
  191. //列表页数据
  192. list, err = cygx.GetCompanyContractListJoinCompany(condition, pars, startSize, pageSize)
  193. if err != nil {
  194. br.Msg = "获取失败"
  195. br.ErrMsg = "获取失败,Err:" + err.Error()
  196. return
  197. }
  198. listLen := len(list)
  199. if listLen == 0 {
  200. list = make([]*cygx.CompanyContractResp, 0)
  201. } else {
  202. var contractCodes []string
  203. for _, v := range list {
  204. switch v.Source {
  205. case "系统合同":
  206. v.FormalType = "标准"
  207. case "上传附件":
  208. v.FormalType = "非标"
  209. }
  210. contractCodes = append(contractCodes, v.ContractCode)
  211. }
  212. lencontractCodes := len(contractCodes)
  213. if lencontractCodes > 0 {
  214. //获取标准合同的ID,这里上面的查询已经关联了三张表,拆分吧。。。
  215. condition = ""
  216. joinStr := ""
  217. pars = make([]interface{}, 0)
  218. condition = " AND a.contract_code IN (" + utils.GetOrmInReplace(lencontractCodes) + ") "
  219. pars = append(pars, contractCodes)
  220. listContract, err := contract.GetContractList(condition, joinStr, pars, 0, lencontractCodes)
  221. if err != nil {
  222. br.Msg = "获取合同列表失败!"
  223. br.ErrMsg = "获取合同列表失败,Err:" + err.Error()
  224. return
  225. }
  226. mapContractCode := make(map[string]int)
  227. for _, v := range listContract {
  228. mapContractCode[v.ContractCode] = v.ContractId
  229. }
  230. for _, v := range list {
  231. v.ContractId = mapContractCode[v.ContractCode]
  232. }
  233. }
  234. }
  235. page := paging.GetPaging(currentIndex, pageSize, total)
  236. resp := cygx.CompanyContractListResp{
  237. Paging: page,
  238. List: list,
  239. }
  240. //导出excel
  241. if isExport {
  242. //IncrementalCompanyListExport(this, dataType, resp, br)
  243. return
  244. }
  245. br.Ret = 200
  246. br.Success = true
  247. br.Msg = "获取成功"
  248. br.Data = resp
  249. }
  250. // @Title 详情
  251. // @Description 获取详情接口
  252. // @Param CompanyContractId query int true "ID"
  253. // @Success Ret=200 {object} cygx.CygxAllocationCompanyContractDetailResp
  254. // @router /allocation/detail [get]
  255. func (this *ContractAllocationController) Detail() {
  256. br := new(models.BaseResponse).Init()
  257. defer func() {
  258. this.Data["json"] = br
  259. this.ServeJSON()
  260. }()
  261. AdminUser := this.SysUser
  262. if AdminUser == nil {
  263. br.Msg = "请登录"
  264. br.ErrMsg = "请登录,用户信息为空"
  265. br.Ret = 408
  266. return
  267. }
  268. resp := new(cygx.CygxAllocationCompanyContractDetailResp)
  269. companyContractId, _ := this.GetInt("CompanyContractId")
  270. if companyContractId < 1 {
  271. br.Msg = "请输入详情ID"
  272. return
  273. }
  274. contractItem, err := company.GetCompanyContractById(companyContractId)
  275. if err != nil {
  276. br.Msg = "获取信息失败"
  277. br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
  278. return
  279. }
  280. total, err := cygx.GetCygxAllocationCompanyContractCountByCompanyContractId(companyContractId)
  281. if err != nil {
  282. br.Msg = "获取信息失败"
  283. br.ErrMsg = "获取合同信息失败,GetCygxAllocationCompanyContractCountByCompanyContractId Err:" + err.Error()
  284. return
  285. }
  286. if total == 0 {
  287. }
  288. var contractPermissionList []*company.ContractPermissionList
  289. expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
  290. //classifyName := "权益"
  291. checkList := make([]int, 0)
  292. plist := new(company.ContractPermissionList)
  293. hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
  294. if e != nil {
  295. br.Msg = "获取失败"
  296. br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error()
  297. return
  298. }
  299. hasMap := make(map[int]*company.CompanyContractPermission)
  300. for _, p := range hasPermissions {
  301. hasMap[p.ChartPermissionId] = p
  302. }
  303. checkItems := make([]*company.PermissionLookItem, 0)
  304. // PS:本来想把这个移到循环外面去优化一下...但是发现有指针引用变量被改掉的问题, BUG太多了改不完了先这样吧=_=!
  305. raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME)
  306. if e != nil {
  307. br.Msg = "获取失败"
  308. br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error()
  309. return
  310. }
  311. for _, n := range raiPermissions {
  312. match := hasMap[n.ChartPermissionId]
  313. if match == nil {
  314. continue
  315. }
  316. // 升级
  317. if match.IsUpgrade == 1 {
  318. n.IsUpgrade = 1
  319. checkList = append(checkList, n.ChartPermissionId)
  320. checkItems = append(checkItems, n)
  321. continue
  322. }
  323. // 买方研选(3w/5w)
  324. if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
  325. n.PermissionName += expMap[match.ExpensiveYx]
  326. checkList = append(checkList, n.ChartPermissionId)
  327. checkItems = append(checkItems, n)
  328. continue
  329. }
  330. checkList = append(checkList, n.ChartPermissionId)
  331. checkItems = append(checkItems, n)
  332. }
  333. plist.Items = checkItems
  334. plist.ClassifyName = utils.COMPANY_PRODUCT_RAI_NAME
  335. plist.CheckList = checkList
  336. contractPermissionList = append(contractPermissionList, plist)
  337. // CRM8.8-权限主客观合并
  338. newPermissionLookList := contractService.HandleEquityContractPermissionList(contractPermissionList)
  339. for _, v := range newPermissionLookList {
  340. for _, v2 := range v.Items {
  341. fmt.Println(v2.PermissionName)
  342. }
  343. }
  344. resp.Money = contractItem.Money / 10000
  345. resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
  346. br.Ret = 200
  347. br.Success = true
  348. br.Msg = "获取成功"
  349. br.Data = resp
  350. }