report_approve_flow.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. package report_approve
  2. import (
  3. "eta/eta_api/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/rdlucklib/rdluck_tools/paging"
  7. "strings"
  8. "time"
  9. )
  10. // ReportApproveFlow 报告审批流表
  11. type ReportApproveFlow struct {
  12. ReportApproveFlowId int `orm:"column(report_approve_flow_id);pk" description:"审批流ID"`
  13. FlowName string `description:"审批流名称"`
  14. ReportType int `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
  15. ClassifyFirstId int `description:"一级分类ID"`
  16. ClassifySecondId int `description:"二级分类ID"`
  17. ClassifyThirdId int `description:"三级分类ID"`
  18. CurrVersion int `description:"当前版本号"`
  19. CreateTime time.Time `description:"创建时间"`
  20. ModifyTime time.Time `description:"修改时间"`
  21. }
  22. var ReportApproveFlowCols = struct {
  23. ReportApproveFlowId string
  24. FlowName string
  25. ReportType string
  26. ClassifyFirstId string
  27. ClassifySecondId string
  28. ClassifyThirdId string
  29. CurrVersion string
  30. CreateTime string
  31. ModifyTime string
  32. }{
  33. ReportApproveFlowId: "report_approve_flow_id",
  34. FlowName: "flow_name",
  35. ReportType: "report_type",
  36. ClassifyFirstId: "classify_first_id",
  37. ClassifySecondId: "classify_second_id",
  38. ClassifyThirdId: "classify_third_id",
  39. CurrVersion: "curr_version",
  40. CreateTime: "create_time",
  41. ModifyTime: "modify_time",
  42. }
  43. func (m *ReportApproveFlow) TableName() string {
  44. return "report_approve_flow"
  45. }
  46. func (m *ReportApproveFlow) PrimaryId() string {
  47. return ReportApproveFlowCols.ReportApproveFlowId
  48. }
  49. func (m *ReportApproveFlow) Create() (err error) {
  50. o := orm.NewOrmUsingDB("rddp")
  51. id, err := o.Insert(m)
  52. if err != nil {
  53. return
  54. }
  55. m.ReportApproveFlowId = int(id)
  56. return
  57. }
  58. func (m *ReportApproveFlow) CreateMulti(items []*ReportApproveFlow) (err error) {
  59. if len(items) == 0 {
  60. return
  61. }
  62. o := orm.NewOrmUsingDB("rddp")
  63. _, err = o.InsertMulti(len(items), items)
  64. return
  65. }
  66. func (m *ReportApproveFlow) Update(cols []string) (err error) {
  67. o := orm.NewOrmUsingDB("rddp")
  68. _, err = o.Update(m, cols...)
  69. return
  70. }
  71. func (m *ReportApproveFlow) Del() (err error) {
  72. o := orm.NewOrmUsingDB("rddp")
  73. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
  74. _, err = o.Raw(sql, m.ReportApproveFlowId).Exec()
  75. return
  76. }
  77. func (m *ReportApproveFlow) MultiDel(menuIds []int) (err error) {
  78. if len(menuIds) == 0 {
  79. return
  80. }
  81. o := orm.NewOrmUsingDB("rddp")
  82. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
  83. _, err = o.Raw(sql, menuIds).Exec()
  84. return
  85. }
  86. func (m *ReportApproveFlow) GetItemById(id int) (item *ReportApproveFlow, err error) {
  87. o := orm.NewOrmUsingDB("rddp")
  88. sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
  89. err = o.Raw(sql, id).QueryRow(&item)
  90. return
  91. }
  92. func (m *ReportApproveFlow) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ReportApproveFlow, err error) {
  93. o := orm.NewOrmUsingDB("rddp")
  94. order := ``
  95. if orderRule != "" {
  96. order = ` ORDER BY ` + orderRule
  97. }
  98. sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
  99. err = o.Raw(sql, pars).QueryRow(&item)
  100. return
  101. }
  102. func (m *ReportApproveFlow) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
  103. o := orm.NewOrmUsingDB("rddp")
  104. sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
  105. err = o.Raw(sql, pars).QueryRow(&count)
  106. return
  107. }
  108. func (m *ReportApproveFlow) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ReportApproveFlow, err error) {
  109. o := orm.NewOrmUsingDB("rddp")
  110. fields := strings.Join(fieldArr, ",")
  111. if len(fieldArr) == 0 {
  112. fields = `*`
  113. }
  114. order := `ORDER BY create_time DESC`
  115. if orderRule != "" {
  116. order = ` ORDER BY ` + orderRule
  117. }
  118. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
  119. _, err = o.Raw(sql, pars).QueryRows(&items)
  120. return
  121. }
  122. func (m *ReportApproveFlow) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*ReportApproveFlow, err error) {
  123. o := orm.NewOrmUsingDB("rddp")
  124. fields := strings.Join(fieldArr, ",")
  125. if len(fieldArr) == 0 {
  126. fields = `*`
  127. }
  128. order := `ORDER BY create_time DESC`
  129. if orderRule != "" {
  130. order = ` ORDER BY ` + orderRule
  131. }
  132. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
  133. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  134. return
  135. }
  136. // ReportApproveFlowItem 报告审批流信息
  137. type ReportApproveFlowItem struct {
  138. ReportApproveFlowId int `description:"审批流ID"`
  139. FlowName string `description:"审批流名称"`
  140. ReportType int `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
  141. ClassifyFirstId int `description:"一级分类ID"`
  142. ClassifySecondId int `description:"二级分类ID"`
  143. ReportClassify string `description:"报告类型: XX研报/一级分类/二级分类"`
  144. CreateTime string `description:"创建时间"`
  145. ModifyTime string `description:"修改时间"`
  146. }
  147. // FormatReportApproveFlow2Item 格式化报告审批流
  148. func FormatReportApproveFlow2Item(origin *ReportApproveFlow) (item *ReportApproveFlowItem) {
  149. item = new(ReportApproveFlowItem)
  150. if origin == nil {
  151. return
  152. }
  153. item.ReportApproveFlowId = origin.ReportApproveFlowId
  154. item.FlowName = origin.FlowName
  155. item.ReportType = origin.ReportType
  156. item.ClassifyFirstId = origin.ClassifyFirstId
  157. item.ClassifySecondId = origin.ClassifySecondId
  158. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
  159. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
  160. return
  161. }
  162. // ReportApproveFlowAddReq 新增报告审批流请求体
  163. type ReportApproveFlowAddReq struct {
  164. FlowName string `description:"审批流名称"`
  165. ReportType int `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
  166. ClassifyFirstId int `description:"一级分类ID"`
  167. ClassifySecondId int `description:"二级分类ID"`
  168. Nodes []ReportApproveNodeSaveReq `description:"审批节点信息"`
  169. }
  170. // ReportApproveFlowEditReq 编辑报告审批流请求体
  171. type ReportApproveFlowEditReq struct {
  172. ReportApproveFlowId int `description:"审批流ID"`
  173. ReportApproveFlowAddReq
  174. }
  175. // ReportApproveFlowRemoveReq 删除报告审批流请求体
  176. type ReportApproveFlowRemoveReq struct {
  177. ReportApproveFlowId int `description:"报告审批流ID"`
  178. }
  179. type ReportClassifyTreeItem struct {
  180. ClassifyId int `description:"分类ID"`
  181. ClassifyName string `description:"分类名称"`
  182. ParentId int `description:"父级ID"`
  183. HasFlow bool `description:"是否已配置审批流"`
  184. Children []*ReportClassifyTreeItem `description:"子分类"`
  185. }
  186. // CreateFlowAndNodes 新增审批流和节点
  187. func (m *ReportApproveFlow) CreateFlowAndNodes(flowItem *ReportApproveFlow, nodeItems []*ReportApproveNode) (err error) {
  188. if flowItem == nil {
  189. err = fmt.Errorf("flow is nil")
  190. return
  191. }
  192. o := orm.NewOrmUsingDB("rddp")
  193. tx, e := o.Begin()
  194. if e != nil {
  195. err = fmt.Errorf("orm begin err: %s", e.Error())
  196. return
  197. }
  198. prevNodes := make([]*ReportApproveNode, 0)
  199. defer func() {
  200. if err != nil {
  201. _ = tx.Rollback()
  202. return
  203. }
  204. _ = tx.Commit()
  205. // 更新每个节点的下一个节点信息, 放在事务中会更新失败
  206. if e = m.UpdateNextNodes(prevNodes); e != nil {
  207. err = fmt.Errorf("UpdatePrevNodes err: %s", e.Error())
  208. return
  209. }
  210. }()
  211. lastId, e := tx.Insert(flowItem)
  212. if e != nil {
  213. err = fmt.Errorf("insert flow err: %s", e.Error())
  214. return
  215. }
  216. flowItem.ReportApproveFlowId = int(lastId)
  217. nodesLen := len(nodeItems)
  218. if nodesLen == 0 {
  219. return
  220. }
  221. prevId := 0
  222. prevNode := new(ReportApproveNode)
  223. for k, v := range nodeItems {
  224. v.ReportApproveFlowId = flowItem.ReportApproveFlowId
  225. v.PrevNodeId = prevId
  226. id, e := tx.Insert(v)
  227. if e != nil {
  228. err = fmt.Errorf("insert node err: %s", e.Error())
  229. return
  230. }
  231. v.ReportApproveNodeId = int(id)
  232. prevId = v.ReportApproveNodeId
  233. // 下一个节点
  234. if prevNode != nil && k > 0 && k < nodesLen {
  235. prevNode.NextNodeId = int(id)
  236. prevNodes = append(prevNodes, prevNode)
  237. }
  238. prevNode = v
  239. }
  240. return
  241. }
  242. func (m *ReportApproveFlow) UpdateNextNodes(nodes []*ReportApproveNode) (err error) {
  243. if len(nodes) == 0 {
  244. return
  245. }
  246. updateCols := []string{"NextNodeId"}
  247. for _, v := range nodes {
  248. e := v.Update(updateCols)
  249. if e != nil {
  250. err = fmt.Errorf("prev node update err: %s", e.Error())
  251. return
  252. }
  253. }
  254. return
  255. }
  256. // UpdateFlowAndNodes 更新审批流和节点
  257. func (m *ReportApproveFlow) UpdateFlowAndNodes(flowItem *ReportApproveFlow, nodeItems []*ReportApproveNode) (err error) {
  258. if flowItem == nil {
  259. err = fmt.Errorf("flow is nil")
  260. return
  261. }
  262. o := orm.NewOrmUsingDB("rddp")
  263. tx, e := o.Begin()
  264. if e != nil {
  265. err = fmt.Errorf("orm begin err: %s", e.Error())
  266. return
  267. }
  268. prevNodes := make([]*ReportApproveNode, 0)
  269. defer func() {
  270. if err != nil {
  271. _ = tx.Rollback()
  272. return
  273. }
  274. _ = tx.Commit()
  275. // 更新每个节点的下一个节点信息, 放在事务中会更新失败
  276. if e = m.UpdateNextNodes(prevNodes); e != nil {
  277. err = fmt.Errorf("UpdatePrevNodes err: %s", e.Error())
  278. return
  279. }
  280. }()
  281. // 更新审批流
  282. updateCols := []string{"FlowName", "ReportType", "ClassifyFirstId", "ClassifySecondId", "CurrVersion", "ModifyTime"}
  283. if e = flowItem.Update(updateCols); e != nil {
  284. err = fmt.Errorf("update flow err: %s", e.Error())
  285. return
  286. }
  287. // 新增节点(旧版的节点不删除, 根据版本号区分)
  288. nodesLen := len(nodeItems)
  289. if nodesLen == 0 {
  290. return
  291. }
  292. prevId := 0
  293. prevNode := new(ReportApproveNode)
  294. for k, v := range nodeItems {
  295. v.ReportApproveFlowId = flowItem.ReportApproveFlowId
  296. v.PrevNodeId = prevId
  297. id, e := tx.Insert(v)
  298. if e != nil {
  299. err = fmt.Errorf("insert node err: %s", e.Error())
  300. return
  301. }
  302. v.ReportApproveNodeId = int(id)
  303. prevId = v.ReportApproveNodeId
  304. // 下一个节点
  305. if prevNode != nil && k > 0 && k < nodesLen {
  306. prevNode.NextNodeId = int(id)
  307. prevNodes = append(prevNodes, prevNode)
  308. }
  309. prevNode = v
  310. }
  311. return
  312. }
  313. // ReportApproveFlowDetailItem 报告审批流详情信息
  314. type ReportApproveFlowDetailItem struct {
  315. ReportApproveFlowItem `description:"审批流信息"`
  316. Nodes []*ReportApproveNodeItem `description:"节点信息"`
  317. }
  318. // FormatFlowAndNodesItem2Detail 格式化审批流详情
  319. func FormatFlowAndNodesItem2Detail(flowItem *ReportApproveFlow, nodeItems []*ReportApproveNode) (detail *ReportApproveFlowDetailItem, err error) {
  320. if flowItem == nil {
  321. return
  322. }
  323. detail = new(ReportApproveFlowDetailItem)
  324. detail.ReportApproveFlowId = flowItem.ReportApproveFlowId
  325. detail.FlowName = flowItem.FlowName
  326. detail.ReportType = flowItem.ReportType
  327. detail.ClassifyFirstId = flowItem.ClassifyFirstId
  328. detail.ClassifySecondId = flowItem.ClassifySecondId
  329. detail.CreateTime = utils.TimeTransferString(utils.FormatDateTime, flowItem.CreateTime)
  330. detail.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, flowItem.ModifyTime)
  331. detail.Nodes = make([]*ReportApproveNodeItem, 0)
  332. for _, v := range nodeItems {
  333. t, e := FormatReportApproveNode2Item(v)
  334. if e != nil {
  335. err = fmt.Errorf("format node err: %s", e.Error())
  336. return
  337. }
  338. detail.Nodes = append(detail.Nodes, t)
  339. }
  340. return
  341. }
  342. // ReportApproveFlowListReq 审批流列表请求体
  343. type ReportApproveFlowListReq struct {
  344. PageSize int `form:"PageSize"`
  345. CurrentIndex int `form:"CurrentIndex"`
  346. ReportType int `form:"ReportType" description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
  347. ClassifyFirstId int `form:"ClassifyFirstId" description:"一级分类ID"`
  348. ClassifySecondId int `form:"ClassifySecondId" description:"二级分类ID"`
  349. Keyword string `form:"Keyword" description:"关键词"`
  350. SortRule int `form:"SortRule" description:"排序方式: 1-正序; 2-倒序(默认)"`
  351. }
  352. // ReportApproveFlowListResp 审批流列表响应体
  353. type ReportApproveFlowListResp struct {
  354. List []*ReportApproveFlowItem
  355. Paging *paging.PagingItem `description:"分页数据"`
  356. }