contract.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package contract
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "hongze/hongze_mobile_admin/models/custom"
  7. contractCustom "hongze/hongze_mobile_admin/models/custom/contract"
  8. contractReq "hongze/hongze_mobile_admin/models/request/contract"
  9. contractResp "hongze/hongze_mobile_admin/models/response/contract"
  10. "hongze/hongze_mobile_admin/models/tables/company_report_permission"
  11. "hongze/hongze_mobile_admin/models/tables/contract"
  12. "hongze/hongze_mobile_admin/models/tables/contract_approval"
  13. "hongze/hongze_mobile_admin/models/tables/contract_approval_record"
  14. "hongze/hongze_mobile_admin/models/tables/contract_operation_record"
  15. "hongze/hongze_mobile_admin/models/tables/contract_service_detail"
  16. "hongze/hongze_mobile_admin/utils"
  17. "rdluck_tools/orm"
  18. "reflect"
  19. "strings"
  20. "time"
  21. )
  22. // InvalidContract 作废合同
  23. func InvalidContract(contractId int, opUser *custom.AdminWx) (err error) {
  24. //查询当前合同信息
  25. nowContract, err := contract.GetContractById(contractId)
  26. if err != nil {
  27. if err.Error() == utils.ErrNoRow() {
  28. err = errors.New(fmt.Sprint("根据合同编号:", contractId, " 找不到初始合同"))
  29. }
  30. return
  31. }
  32. if nowContract.SellerId != opUser.AdminId && opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
  33. err = errors.New("当前账号无操作权限")
  34. return
  35. }
  36. if nowContract.Status != "已审批" {
  37. err = errors.New("合同状态异常,不允许作废,当前合同状态:" + nowContract.Status)
  38. return
  39. }
  40. //如果删除状态 >0,那么代表已经被删除了
  41. if nowContract.IsDelete > 0 {
  42. err = errors.New("该合同已删除")
  43. return
  44. }
  45. //合同作废
  46. err = contract.InvalidContract(nowContract)
  47. if err != nil {
  48. return
  49. }
  50. //添加操作日志
  51. remark := "作废合同模板"
  52. _ = contract_operation_record.AddContractOperationRecord(nowContract.ContractId, opUser.AdminId, 0, "invalid", opUser.RealName, remark)
  53. return
  54. }
  55. // GetContractDetail 根据id获取合同详情(包含服务)
  56. func GetContractDetail(contractId int) (contractDetail *contract.ContractDetail, err error) {
  57. contractDetail, err = contract.GetContractDetailById(contractId)
  58. if err != nil {
  59. if err.Error() == utils.ErrNoRow() {
  60. err = errors.New("找不到该合同")
  61. }
  62. return
  63. }
  64. serviceList, err := contractCustom.GetContractServiceAndDetailList(contractId)
  65. if err != nil {
  66. err = errors.New(fmt.Sprint("查找合同服务异常", err))
  67. return
  68. }
  69. for i := 0; len(serviceList) > i; i++ {
  70. if serviceList[i].HasDetail == "是" {
  71. list, detailErr := contract_service_detail.GetContractServiceDetailListByServiceId(serviceList[i].ContractServiceId)
  72. if detailErr != nil {
  73. err = errors.New(fmt.Sprint("查找合同服务详情异常", detailErr))
  74. return
  75. }
  76. serviceList[i].DetailList = list
  77. }
  78. }
  79. contractDetail.Service = serviceList
  80. return
  81. }
  82. // UploadCheckBackFile 更新上传签回合同附件
  83. func UploadCheckBackFile(contractId int, fileUrl string, opUser *custom.AdminWx) (err error) {
  84. //获取合同信息
  85. contractInfo, err := contract.GetContractById(contractId)
  86. if err != nil {
  87. return
  88. }
  89. if err != nil {
  90. return
  91. }
  92. //合同状态判断
  93. if contractInfo.Status != "已审批" && contractInfo.Status != "已签回" {
  94. err = errors.New("合同状态异常,不允许上传签回合同附件,当前合同状态:" + contractInfo.Status)
  95. return
  96. }
  97. contractInfo.CheckBackFileUrl = fileUrl
  98. contractInfo.Status = "已签回"
  99. contractInfo.ModifyTime = time.Now()
  100. contractInfo.CheckBackFileTime = time.Now()
  101. err = contractInfo.Update([]string{"CheckBackFileUrl", "Status", "ModifyTime", "CheckBackFileTime"})
  102. if err != nil {
  103. return
  104. }
  105. //同步更新客户那边提交审批的合同
  106. o := orm.NewOrm()
  107. sql := `update company_contract set img_url = ? where contract_code=? and source="系统合同" `
  108. _, err = o.Raw(sql, contractInfo.CheckBackFileUrl, contractInfo.ContractCode).Exec()
  109. //添加操作日志
  110. remark := "上传签回合同附件"
  111. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUser.AdminId, 0, "upload", opUser.RealName, remark)
  112. return
  113. }
  114. // GetOpButton 获取审批流和权限
  115. func GetOpButton(contractInfo *contract.ContractDetail, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (contractOpButton contractResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
  116. //审批流
  117. approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
  118. if err != nil {
  119. err = errors.New("获取审批失败,Err:" + err.Error())
  120. return
  121. }
  122. flowNodeMap := make(map[int][]contract_approval_record.ContractApprovalRecord, 0)
  123. keySort := make([]int, 0)
  124. for _, approvalRecord := range approvalRecordList {
  125. //如果当前节点正好是该节点,同时审批单状态是待审批状态,然后当前账号又有权限,该账号也正是审批人,那么允许审批操作
  126. if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && contractApprovalInfo.Status == "待审批" {
  127. if opUser.AdminId == approvalRecord.ApproveUserId && approvalRecord.NodeType == "check" {
  128. contractOpButton.Approval = true
  129. }
  130. }
  131. if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
  132. flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
  133. } else {
  134. tmpFlowNodeList := make([]contract_approval_record.ContractApprovalRecord, 1)
  135. tmpFlowNodeList[0] = *approvalRecord
  136. flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
  137. keySort = append(keySort, approvalRecord.NodeId)
  138. }
  139. }
  140. for _, key := range keySort {
  141. flowNodeListResp = append(flowNodeListResp, flowNodeMap[key])
  142. }
  143. //是否具有签回合同权限
  144. uploadStatus := []string{"已审批", "已签回"}
  145. if opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE && strings.Contains(strings.Join(uploadStatus, ","), contractInfo.Status) {
  146. contractOpButton.UploadFile = true
  147. }
  148. //作废权限
  149. if (opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || opUser.AdminId == contractInfo.SellerId) && contractInfo.Status == "已审批" {
  150. contractOpButton.Invalid = true
  151. }
  152. return
  153. }
  154. // GetContractDetailByContractId 根据合同获取合同详情
  155. func GetContractDetailByContractId(contractId int, opUser *custom.AdminWx) (contractInfo *contract.ContractDetail, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, opButton contractResp.OpButton, err error) {
  156. contractInfo, err = GetContractDetail(contractId)
  157. if err != nil {
  158. err = errors.New("获取合同详情失败,ERR:" + err.Error())
  159. return
  160. }
  161. contractInfo.StartDateStr = contractInfo.StartDate.Format(utils.FormatDate)
  162. contractInfo.EndDateStr = contractInfo.EndDate.Format(utils.FormatDate)
  163. contractInfo.ModifyTimeStr = contractInfo.ModifyTime.Format(utils.FormatDateTime)
  164. contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime)
  165. //合同中包含的产品权限
  166. permissionLookList, _ := GetPermissionByContractService(contractInfo.ProductId, contractInfo.Service)
  167. contractInfo.PermissionLookList = permissionLookList
  168. //查询最近一次审批单信息
  169. lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")
  170. if err != nil {
  171. if err.Error() != utils.ErrNoRow() {
  172. err = errors.New("获取最近一次审批单信息失败,ERR:" + err.Error())
  173. }
  174. err = nil
  175. return
  176. }
  177. if lastApprovalInfo != nil {
  178. //审批操作权限,上传签回文件权限
  179. tmpContractOpButton, tmpFlowNodeListResp, tmpErr := GetOpButton(contractInfo, lastApprovalInfo, opUser)
  180. if tmpErr != nil {
  181. err = errors.New("获取合同按钮权限、审批流程失败,ERR:" + tmpErr.Error())
  182. return
  183. }
  184. opButton = tmpContractOpButton
  185. flowNodeListResp = tmpFlowNodeListResp
  186. }
  187. return
  188. }
  189. // GetProductCelData 获取品种列数据(因为前端可以随意插入列数据,所以需要根据列名来搜索对应的品种列)
  190. func GetProductCelData(detail contract_service_detail.ContractServiceDetail, tableCel *contractReq.AddContractServiceDetailReq) (err error) {
  191. t := reflect.TypeOf(detail)
  192. v := reflect.ValueOf(detail)
  193. for k := 0; k < t.NumField(); k++ {
  194. //获取结构体的参数名
  195. tmpName := t.Field(k).Name
  196. if strings.Contains(tmpName, "Col") {
  197. //获取结构体该参数名的值
  198. tmpValue := v.Field(k).String()
  199. //如果值不为空的话,那么做下json转换
  200. if tmpValue != "" {
  201. tmpErr := json.Unmarshal([]byte(tmpValue), tableCel)
  202. if tmpErr != nil {
  203. err = tmpErr
  204. continue
  205. }
  206. if tableCel.HeadName == "品种" {
  207. err = nil
  208. return
  209. }
  210. }
  211. }
  212. }
  213. return
  214. }
  215. // GetPermissionByContractService 通过合同服务,获取权限集合列表
  216. func GetPermissionByContractService(productId int, serviceList []*contractCustom.ContractServiceAndDetail) (permissionList []*company_report_permission.PermissionLookList, err error) {
  217. //子权限切片集合
  218. var permissionClassifyArr []string
  219. if productId == 1 {
  220. for _, v := range utils.PermissionFiccClassifyArr {
  221. permissionClassifyArr = append(permissionClassifyArr, v)
  222. }
  223. } else {
  224. permissionClassifyArr = append(permissionClassifyArr, "权益")
  225. }
  226. //获取已经勾选的的权限
  227. checkPermissionIdMap, err := GetServicePermissionMap(serviceList)
  228. if err != nil {
  229. return
  230. }
  231. //遍历获取
  232. for _, v := range permissionClassifyArr {
  233. checkList := make([]int, 0)
  234. plist := new(company_report_permission.PermissionLookList)
  235. items, tmpErr := company_report_permission.GetPermissionLookItems(productId, v)
  236. if tmpErr != nil {
  237. err = tmpErr
  238. return
  239. }
  240. for _, n := range items {
  241. if _, ok := checkPermissionIdMap[n.ChartPermissionId]; ok {
  242. checkList = append(checkList, n.ChartPermissionId)
  243. }
  244. }
  245. plist.Items = items
  246. plist.ClassifyName = v
  247. plist.CheckList = checkList
  248. permissionList = append(permissionList, plist)
  249. }
  250. return
  251. }
  252. // GetServicePermissionMap 获取合同服务中的权限id map
  253. func GetServicePermissionMap(serviceList []*contractCustom.ContractServiceAndDetail) (checkPermissionIdMap map[int]int, err error) {
  254. checkPermissionIdMap = make(map[int]int)
  255. //获取已经勾选的的权限
  256. for _, contractService := range serviceList {
  257. //如果是权益,那么研选必要
  258. if contractService.ProductId == 2 {
  259. chartPermissionId := 31 //研 选服务
  260. checkPermissionIdMap[chartPermissionId] = chartPermissionId
  261. }
  262. //看看系统中有没有映射对应的权限,如果有的话,那么直接返回,没有那么可能是特殊服务,需要去遍历
  263. if contractService.ChartPermissionId > 0 {
  264. checkPermissionIdMap[contractService.ChartPermissionId] = contractService.ChartPermissionId
  265. continue
  266. }
  267. switch contractService.ServiceTemplateId {
  268. case 1: //ficc 大套餐
  269. for _, v := range utils.PermissionFiccClassifyArr {
  270. //大套餐中 市场策略暂时不作为勾选项
  271. if v == "市场策略" {
  272. continue
  273. }
  274. items, tmpErr := company_report_permission.GetPermissionLookItems(1, v)
  275. if tmpErr != nil {
  276. err = tmpErr
  277. return
  278. }
  279. for _, n := range items {
  280. checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
  281. }
  282. }
  283. case 2: //ficc小套餐
  284. permissionValues := []string{
  285. "FICC周报", "商品双周报+线上电话会讨论会<br/>(由弘则的研究员主持线上讨论)", "数据点评",
  286. }
  287. for _, detail := range contractService.DetailList {
  288. var tableCel contractReq.AddContractServiceDetailReq
  289. tmpErr := json.Unmarshal([]byte(detail.Col1), &tableCel)
  290. if tmpErr != nil {
  291. err = tmpErr
  292. return
  293. }
  294. if strings.Contains(strings.Join(permissionValues, ","), tableCel.Value) {
  295. //获取品种列数据
  296. var tableCel2 contractReq.AddContractServiceDetailReq
  297. tmpErr := GetProductCelData(*detail, &tableCel2)
  298. if tmpErr != nil {
  299. err = tmpErr
  300. return
  301. }
  302. for _, serviceId := range tableCel2.ValueId {
  303. checkPermissionIdMap[serviceId] = serviceId
  304. }
  305. }
  306. }
  307. case 4, 5, 6: //权益大套餐
  308. permissionFiccClassifyArr := []string{"权益"}
  309. for _, v := range permissionFiccClassifyArr {
  310. items, tmpErr := company_report_permission.GetPermissionLookItems(2, v)
  311. if tmpErr != nil {
  312. err = tmpErr
  313. return
  314. }
  315. for _, n := range items {
  316. //如果是专家行业,那么 结束当前循环,进入下一循环(产品需求:专家行业不在里面)
  317. if n.ChartPermissionId == 29 {
  318. continue
  319. }
  320. checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
  321. }
  322. }
  323. }
  324. }
  325. return
  326. }