order_procedure_manager.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. package utils
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/gogf/gf/database/gdb"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/os/gtime"
  8. "github.com/gogf/gf/util/gmeta"
  9. "youngmini_server/app/dao"
  10. "youngmini_server/app/model"
  11. )
  12. var OrderProcedureManager = orderProcedureManager{}
  13. type orderProcedureManager struct {
  14. }
  15. // MethodType 拍单方式
  16. type MethodType int
  17. const (
  18. MethodTypeNo MethodType = iota
  19. MethodTypeYes
  20. MethodTypeOther
  21. )
  22. type buySamplesType int
  23. const (
  24. buySamplesTypeNo buySamplesType = iota + 1
  25. )
  26. type procedureStage int
  27. // 订单执行阶段
  28. const (
  29. procedureStageWaitForSelect procedureStage = iota + 1 // 等待反选阶段
  30. procedureStageBuySamples // 拍单阶段
  31. procedureStageDraft // 初稿阶段
  32. procedureStageArticle // 作品阶段
  33. procedureStageLinkTest // 链接质检阶段
  34. procedureStageDataTest // 数据质检阶段
  35. procedureStageReturnSamples // 拍单样品寄回阶段
  36. procedureStageComplete // 订单完成阶段
  37. )
  38. type procedureState int
  39. const (
  40. procedureStateNotStart procedureState = iota + 1
  41. orderStepStateGoingOn
  42. orderStepStateFail
  43. orderStepStateSuc
  44. )
  45. // DeductReasonOrderOvertime 扣费原因超期扣费
  46. const DeductReasonOrderOvertime = 1
  47. // 下面的值会出现在"suc_next_step"或"fail_next_step"字段,表示当前步骤成功或失败后进入的下个步骤
  48. // 254 表示任务终止
  49. const orderFinishCode uint = 254
  50. // 255 表示进入订单的下一个stage
  51. const nextStageCode = 255
  52. // 0 表示保持在本步骤不动
  53. const selfStepCode = 0
  54. type OrderLimitAndReduceFeeInfo struct {
  55. gmeta.Meta `orm:"table:task_base_info"`
  56. TaskId int `json:"task_id"`
  57. DraftInfo *model.TaskProcedureDraftInfo `orm:"with:task_base_id=task_id"`
  58. ArticleInfo *model.TaskProcedureArticleInfo `orm:"with:task_base_id=task_id"`
  59. DataAndQualityInfo *model.TaskProcedureQualityDataTestInfo `orm:"with:task_base_id=task_id"`
  60. }
  61. func (*orderProcedureManager) setLimitDaysInfoForProcedure(node *model.WorkflowNodeContainer, limitInfo *OrderLimitAndReduceFeeInfo, stage int) {
  62. if node.ProcedureStage == int(procedureStageDraft) && node.StepInStage == 1 && limitInfo.DraftInfo != nil {
  63. // 上传初稿天数限制
  64. node.LimitDays1 = limitInfo.DraftInfo.UploadLimitDay
  65. // 上传初稿超期扣费率
  66. node.ReduceFeeRatio1 = limitInfo.DraftInfo.UploadReduceRate
  67. // 上传初稿天数限制
  68. node.LimitDays2 = limitInfo.DraftInfo.ReviseLimitDay
  69. // 上传初稿超期扣费率
  70. node.ReduceFeeRatio2 = limitInfo.DraftInfo.ReviseReduceRate
  71. }
  72. if node.ProcedureStage == int(procedureStageArticle) && node.StepInStage == 1 && limitInfo.ArticleInfo != nil {
  73. // 上传作品天数限制
  74. node.LimitDays1 = limitInfo.ArticleInfo.UploadLimitDay
  75. // 上传作品超期扣费率
  76. node.ReduceFeeRatio1 = limitInfo.ArticleInfo.UploadReduceRate
  77. // 上传作品天数限制
  78. node.LimitDays2 = limitInfo.ArticleInfo.ReviseLimitDay
  79. // 上传作品超期扣费率
  80. node.ReduceFeeRatio2 = limitInfo.ArticleInfo.ReviseReduceRate
  81. }
  82. if node.ProcedureStage == int(procedureStageLinkTest) && node.StepInStage == 1 && limitInfo.DataAndQualityInfo != nil {
  83. // 上传发布链接天数限制
  84. node.LimitDays1 = limitInfo.DataAndQualityInfo.QualityTestLimitDay
  85. // 上传发布链接超期扣费率
  86. node.ReduceFeeRatio1 = limitInfo.DataAndQualityInfo.QualityTestReduceRate
  87. // 上传发布链接天数限制
  88. node.LimitDays2 = limitInfo.DataAndQualityInfo.QualityReviseLimitDay
  89. // 上传发布链接超期扣费率
  90. node.ReduceFeeRatio2 = limitInfo.DataAndQualityInfo.QualityReviseReduseRate
  91. }
  92. if node.ProcedureStage == int(procedureStageDataTest) && node.StepInStage == 1 && limitInfo.DataAndQualityInfo != nil {
  93. // 上传质检链接天数限制
  94. node.LimitDays1 = limitInfo.DataAndQualityInfo.DataTestLimitDay
  95. // 上传质检链接超期扣费率
  96. node.ReduceFeeRatio1 = limitInfo.DataAndQualityInfo.DataTestReduceRate
  97. // 上传质检链接天数限制
  98. node.LimitDays2 = limitInfo.DataAndQualityInfo.DataReviceLimitDay
  99. // 上传质检链接超期扣费率
  100. node.ReduceFeeRatio2 = limitInfo.DataAndQualityInfo.DataReviceReduceRate
  101. }
  102. }
  103. //func (*orderProcedureManager)calPrevSortId(curSortId int, )
  104. func (t *orderProcedureManager)fillOrderWorkflowToDatabase(taskId, orderId int, stageList []int, ctx context.Context, tx *gdb.TX) error {
  105. var orderLimitInfo *OrderLimitAndReduceFeeInfo
  106. err := g.DB().Model(dao.TaskBaseInfo.Table).WithAll().Where(dao.TaskBaseInfo.Columns.TaskId, taskId).Scan(&orderLimitInfo)
  107. if err != nil {}
  108. res, err := g.DB().Model(dao.WorkflowNodeTemplate.Table).
  109. OrderAsc("procedure_stage, step_in_stage").
  110. All("procedure_stage in (?)", stageList)
  111. if err != nil {
  112. return err
  113. }
  114. workflowNodeList := make([]model.WorkflowNodeContainer, 0)
  115. var sucSortId, failSortId, nextStep uint
  116. //建立每一个流程的每一步到sortId的索引
  117. sortIdMap := make(map[uint]map[uint]uint, 0)
  118. for i := 0; i < res.Len(); i++ {
  119. curStage := res[i]["procedure_stage"].Uint()
  120. curStepInStage := res[i]["step_in_stage"].Uint()
  121. if _, ok := sortIdMap[curStage]; !ok {
  122. sortIdMap[curStage] = make(map[uint]uint)
  123. }
  124. sortIdMap[curStage][curStepInStage] = uint(i + 1)
  125. }
  126. for i := 0; i < res.Len(); i++ {
  127. curStage := res[i]["procedure_stage"].Uint()
  128. // 将成功后转到的本stage内的step值替换为完成后的sortId
  129. nextStep = res[i]["suc_next_step"].Uint()
  130. if nextStep == nextStageCode {
  131. // 如果是255则下一步为下一个节点
  132. sucSortId = uint(i + 2)
  133. } else if nextStep == orderFinishCode {
  134. // 如果下一步是254,则订单直接终止
  135. sucSortId = orderFinishCode
  136. } else if nextStep == selfStepCode {
  137. // 如果为0则是本节点
  138. sucSortId = uint(i + 1)
  139. } else {
  140. // 否则查找
  141. v, ok := sortIdMap[curStage][nextStep]
  142. if !ok {
  143. panic("not found sort id of success next step")
  144. }
  145. sucSortId = v
  146. }
  147. // 将失败后转到的本stage内的step值替换为完成后的sortId
  148. nextStep = res[i]["fail_next_step"].Uint()
  149. if nextStep == nextStageCode {
  150. // 如果是255则下一步为下一个节点
  151. failSortId = uint(i + 2)
  152. } else if nextStep == orderFinishCode {
  153. // 如果下一步是254,则订单直接终止
  154. failSortId = orderFinishCode
  155. } else if nextStep == selfStepCode {
  156. // 如果为0则是本节点
  157. failSortId = uint(i + 1)
  158. } else {
  159. // 否则根据已建立的
  160. v, ok := sortIdMap[curStage][nextStep]
  161. if !ok {
  162. panic("not found sort id of failed next step")
  163. }
  164. failSortId = v
  165. }
  166. node := model.WorkflowNodeContainer{
  167. NodeNameFirst: res[i]["node_name_first"].String(),
  168. NodeNameAfterSecond: res[i]["node_name_after_second"].String(),
  169. ProcedureStage: res[i]["procedure_stage"].Int(),
  170. CurExecutionTimes: res[i]["cur_execution_times"].Int(),
  171. MaxExecutionTimes: res[i]["max_execution_times"].Int(),
  172. StepInStage: res[i]["step_in_stage"].Uint(),
  173. Tip: res[i]["tip"].String(),
  174. SucNextStep: sucSortId,
  175. FailNextStep: failSortId,
  176. State: res[i]["state"].Int(),
  177. StartDate: gtime.Now(),
  178. CompleteDate: nil,
  179. CompleteUserName: "",
  180. LimitDays1: 0,
  181. ReduceFeeRatio1: 0,
  182. LimitDays2: 0,
  183. ReduceFeeRatio2: 0,
  184. OperateRoleRestrict: res[i]["operate_role_restrict"].Int(),
  185. SortId: i + 1,
  186. OrderId: orderId,
  187. }
  188. // 上传初稿 上传作品 上传链接 上传数据阶段设置限制天数和扣费信息
  189. t.setLimitDaysInfoForProcedure(&node, orderLimitInfo, node.ProcedureStage)
  190. workflowNodeList = append(workflowNodeList, node)
  191. }
  192. _, err = tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Insert(workflowNodeList)
  193. if err != nil {
  194. return err
  195. }
  196. return nil
  197. }
  198. // GenOrderWorkflowList 生成订单的流程
  199. func (t *orderProcedureManager) GenOrderWorkflowList(taskId, orderId int, ctx context.Context, tx *gdb.TX) error {
  200. r, err := g.DB().Model(model.TaskProcedureDecisionCondition{}).One(dao.TaskProcedureDecisionCondition.Columns.TaskBaseId, taskId)
  201. if err != nil {
  202. return err
  203. }
  204. var procedureIdList []int
  205. // 添加等待反选步骤,必须添加
  206. procedureIdList = append(procedureIdList, 1)
  207. // 如果拍单类型不为“不拍单”,则将拍单对应的步骤加入到流程中
  208. if r[dao.TaskProcedureDecisionCondition.Columns.BuySamplesType].Int() != int(buySamplesTypeNo) {
  209. procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.BuySamplesStage].Int())
  210. }
  211. // 如果需要检查初稿则把检查初稿相关步骤加入任务流程
  212. if r[dao.TaskProcedureDecisionCondition.Columns.ExamineDraft].Int() != int(MethodTypeNo) {
  213. procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.ExamineDraftStage].Int())
  214. }
  215. // 根据是否审核作品添加相应的步骤
  216. if r.Map()[dao.TaskProcedureDecisionCondition.Columns.ReviewArticle] != 0 {
  217. procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.ReviewArticleStage].Int())
  218. }
  219. // 添加质检链接步骤id
  220. procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.QuilityTestStage].Int())
  221. // 添加数据质检步骤id
  222. procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.DataTestStage].Int())
  223. // 根据是否寄回样品添加相应步骤
  224. //if r[dao.TaskProcedureDecisionCondition.Columns.ReturnSamples].Int() != 0 {
  225. // procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.ReturnSamplesStage].Int())
  226. //}
  227. procedureIdList = append(procedureIdList, r[dao.TaskProcedureDecisionCondition.Columns.TaskFisnishStage].Int())
  228. return t.fillOrderWorkflowToDatabase(taskId, orderId, procedureIdList, ctx, tx)
  229. }
  230. // GetOrderWorkFlow 获取订单的所有流程节点
  231. func (*orderProcedureManager)GetOrderWorkFlow(orderId int) (gdb.Result, error) {
  232. res, err := g.DB().Model(dao.WorkflowNodeContainer.Table).
  233. OrderAsc(dao.WorkflowNodeContainer.Columns.SortId).
  234. All(dao.WorkflowNodeContainer.Columns.OrderId, orderId)
  235. return res, err
  236. }
  237. // handleProcedureOvertimeReduceFee 处理扣费 返回扣费金额和错误
  238. func (*orderProcedureManager)handleProcedureOvertimeReduceFee(procedureNode *model.WorkflowNodeContainer,
  239. orderInfo *model.OrderInfo, ctx context.Context, tx *gdb.TX) (int64, error) {
  240. // 天数显示为0表示不限制天数
  241. if procedureNode.LimitDays1 <= 0 && procedureNode.LimitDays2 <= 0 {
  242. return 0, nil
  243. }
  244. // 订单处于上传初稿 上传作品 上传链接 上传数据阶段时会产生超期扣费
  245. if procedureNode.ProcedureStage == int(procedureStageDraft) || procedureNode.ProcedureStage == int(procedureStageArticle) ||
  246. procedureNode.ProcedureStage == int(procedureStageLinkTest) || procedureNode.ProcedureStage == int(procedureStageDataTest) &&
  247. procedureNode.StepInStage == 1 {
  248. days := int(procedureNode.CompleteDate.Sub(procedureNode.StartDate).Seconds() / 86400)
  249. overTime := false
  250. reduceRatio := 0
  251. if procedureNode.CurExecutionTimes == 1 {
  252. if days > procedureNode.LimitDays1 {
  253. overTime = true
  254. reduceRatio = procedureNode.ReduceFeeRatio1
  255. }
  256. } else {
  257. if days > procedureNode.LimitDays2 {
  258. overTime = true
  259. reduceRatio = procedureNode.ReduceFeeRatio2
  260. }
  261. }
  262. if overTime && reduceRatio > 0{
  263. rec, err := tx.Ctx(ctx).Model(dao.TaskRecruitTalentLevel.Table).One(dao.TaskRecruitTalentLevel.Columns.TrtId, orderInfo.TaskLevelId)
  264. if err != nil {
  265. return 0, err
  266. }
  267. // 扣费金额
  268. deductBoBoCoinValue := int64(rec[dao.TaskRecruitTalentLevel.Columns.RewardRoyalties].Float64() * float64(reduceRatio) * 0.01)
  269. // 步骤名
  270. var stageName string
  271. if procedureNode.CurExecutionTimes <= 2 {
  272. stageName = procedureNode.NodeNameFirst
  273. } else {
  274. stageName = procedureNode.NodeNameAfterSecond
  275. }
  276. _, err = tx.Ctx(ctx).Model(dao.BobocoinDeductRecord.Table).Insert(model.BobocoinDeductRecord{
  277. TalentId: orderInfo.TalentId,
  278. BobocoinValue: deductBoBoCoinValue,
  279. OrderId: orderInfo.OrderId,
  280. ProcedureStage: procedureNode.ProcedureStage,
  281. Reason: DeductReasonOrderOvertime,
  282. CreatedAt: gtime.Now(),
  283. TaskName: orderInfo.TaskName,
  284. OperationStage: stageName,
  285. })
  286. if err != nil {
  287. return 0, err
  288. }
  289. return deductBoBoCoinValue, nil
  290. }
  291. }
  292. return 0, nil
  293. }
  294. // OnOperateOrder 根据当前流程节点的操作成功失败状态决定订单下一步流程节点
  295. func (t *orderProcedureManager)OnOperateOrder(orderId int, isSuccess bool, operatorId int, operatorName string, failedReason ...string) error {
  296. err := g.DB().Transaction(context.Background(), func(ctx context.Context, tx *gdb.TX) error {
  297. // 获取订单当前状态
  298. var orderInfo *model.OrderInfo
  299. err1 := tx.Ctx(ctx).Model(dao.OrderInfo.Table).Where(dao.OrderInfo.Columns.OrderId, orderId).Scan(&orderInfo)
  300. if err1 != nil {
  301. return err1
  302. }
  303. // 任务结束状态为已结束则禁止操作
  304. if orderInfo.CompleteStatus > 1 {
  305. return errors.New("order have completed")
  306. }
  307. var curWorkflowNode *model.WorkflowNodeContainer
  308. // 获取订单当前流程节点
  309. err1 = tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).
  310. Where("order_id = ? and sort_id = ?", orderInfo.OrderId, orderInfo.OrderStatus).Scan(&curWorkflowNode)
  311. if err1 != nil {
  312. return err1
  313. }
  314. // 根据成功状态分别进入下一个流程节点
  315. var nextStep uint
  316. if isSuccess {
  317. nextStep = curWorkflowNode.SucNextStep
  318. } else {
  319. nextStep = curWorkflowNode.FailNextStep
  320. }
  321. if nextStep == orderFinishCode {
  322. // 获取此步骤对应的结束类型
  323. rec, err2 := tx.Ctx(ctx).Model(dao.ROrderCompeleteStageToType.Table).
  324. One("order_procedure_stage = ? and order_procedure_step = ?",
  325. curWorkflowNode.ProcedureStage, curWorkflowNode.StepInStage)
  326. if err2 != nil {
  327. return errors.New("query order complete type failed")
  328. }
  329. // 更新当前流程节点的状态
  330. _, err2 = tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Update(g.Map{
  331. dao.WorkflowNodeContainer.Columns.CompleteDate: gtime.Now(),
  332. dao.WorkflowNodeContainer.Columns.CompleteUserName: operatorName,
  333. dao.WorkflowNodeContainer.Columns.State: orderStepStateSuc,
  334. }, dao.WorkflowNodeContainer.Columns.ContainerId, curWorkflowNode.ContainerId)
  335. if err2 != nil {
  336. return err2
  337. }
  338. // 记录结束类型到订单表
  339. completeType := rec[dao.ROrderCompeleteStageToType.Columns.CompleteType].Int()
  340. // 下一步为任务完结则设置任务结束状态为已结束,并设置结束类型
  341. _, err2 = tx.Ctx(ctx).Model(dao.OrderInfo.Table).Update(g.Map{
  342. dao.OrderInfo.Columns.CompleteStatus: completeType,
  343. dao.OrderInfo.Columns.CompleteDate: gtime.Now(),
  344. }, dao.OrderInfo.Columns.OrderId, orderId)
  345. if err2 != nil {
  346. return err1
  347. }
  348. // 如果任务正常结束,则将任务稿费写入卜卜币收入表
  349. if completeType == int(OrderCompleteTypeNormal) {
  350. _, err2 = tx.Ctx(ctx).Model(dao.BobocoinIncomeRecord.Table).Insert(model.BobocoinIncomeRecord{
  351. BobocoinValue: orderInfo.SettleAmount,
  352. OrderId: orderId,
  353. RecruitLevelId: orderInfo.TaskLevelId,
  354. TalentId: orderInfo.TalentId,
  355. CompleteDate: gtime.Now(),
  356. TaskName: orderInfo.TaskName,
  357. })
  358. if err2 != nil {
  359. return err1
  360. }
  361. }
  362. return nil
  363. }
  364. // 获取订单下一个流程节点
  365. var nextWorkflowNode *model.WorkflowNodeContainer
  366. err1 = tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Where("order_id = ? and sort_id = ?", orderId, nextStep).Scan(&nextWorkflowNode)
  367. if err1 != nil {
  368. return err1
  369. }
  370. var failResStr string
  371. if isSuccess {
  372. failResStr = "success"
  373. } else {
  374. if failedReason == nil {
  375. failResStr = "failed"
  376. }
  377. failResStr = failedReason[0]
  378. }
  379. if isSuccess {
  380. // 如果是执行成功,则更新当前节点为完成状态
  381. _, err2 := tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Update(g.Map{
  382. dao.WorkflowNodeContainer.Columns.CompleteDate: gtime.Now(),
  383. dao.WorkflowNodeContainer.Columns.CompleteUserName: operatorName,
  384. dao.WorkflowNodeContainer.Columns.State: orderStepStateSuc,
  385. dao.WorkflowNodeContainer.Columns.FailReason: failResStr,
  386. }, dao.WorkflowNodeContainer.Columns.ContainerId, curWorkflowNode.ContainerId)
  387. if err2 != nil {
  388. return err2
  389. }
  390. } else {
  391. // 执行失败,当前节点状态更新为失败
  392. _, err2 := tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Update(g.Map{
  393. dao.WorkflowNodeContainer.Columns.CompleteDate: nil,
  394. dao.WorkflowNodeContainer.Columns.CompleteUserName: nil,
  395. dao.WorkflowNodeContainer.Columns.State: orderStepStateFail,
  396. dao.WorkflowNodeContainer.Columns.FailReason: failResStr,
  397. }, dao.WorkflowNodeContainer.Columns.ContainerId, curWorkflowNode.ContainerId)
  398. if err2 != nil {
  399. return err2
  400. }
  401. }
  402. // 执行扣费
  403. deductValue, err1 := t.handleProcedureOvertimeReduceFee(curWorkflowNode, orderInfo, ctx, tx)
  404. if err1 != nil {
  405. return err1
  406. }
  407. orderSettleAmount := orderInfo.SettleAmount
  408. if deductValue > 0 {
  409. orderSettleAmount -= deductValue
  410. }
  411. if isSuccess {
  412. // 如果是成功状态则更新下个节点状态,增加下个节点执行次数
  413. _, err1 = tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Update(g.Map{
  414. dao.WorkflowNodeContainer.Columns.StartDate: gtime.Now(),
  415. dao.WorkflowNodeContainer.Columns.CompleteDate: nil,
  416. dao.WorkflowNodeContainer.Columns.CompleteUserName: nil,
  417. dao.WorkflowNodeContainer.Columns.State: orderStepStateGoingOn,
  418. dao.WorkflowNodeContainer.Columns.CurExecutionTimes: nextWorkflowNode.CurExecutionTimes + 1,
  419. }, dao.WorkflowNodeContainer.Columns.ContainerId, nextWorkflowNode.ContainerId)
  420. if err1 != nil {
  421. return err1
  422. }
  423. } else {
  424. // 如果是失败状态则更新下个节点状态,增加下个节点执行次数并将失败原因添加到下个节点
  425. _, err1 = tx.Ctx(ctx).Model(dao.WorkflowNodeContainer.Table).Update(g.Map{
  426. dao.WorkflowNodeContainer.Columns.StartDate: gtime.Now(),
  427. dao.WorkflowNodeContainer.Columns.CompleteDate: nil,
  428. dao.WorkflowNodeContainer.Columns.CompleteUserName: nil,
  429. dao.WorkflowNodeContainer.Columns.State: orderStepStateGoingOn,
  430. dao.WorkflowNodeContainer.Columns.FailReason: failResStr,
  431. dao.WorkflowNodeContainer.Columns.CurExecutionTimes: nextWorkflowNode.CurExecutionTimes + 1,
  432. }, dao.WorkflowNodeContainer.Columns.ContainerId, nextWorkflowNode.ContainerId)
  433. if err1 != nil {
  434. return err1
  435. }
  436. }
  437. // 将下一个流程节点sortId记录在订单状态中
  438. _, err1 = tx.Ctx(ctx).Model(dao.OrderInfo.Table).Update(g.Map{
  439. dao.OrderInfo.Columns.SettleAmount: orderSettleAmount,
  440. dao.OrderInfo.Columns.OrderStatus: nextStep,
  441. }, dao.OrderInfo.Columns.OrderId, orderId)
  442. if err1 != nil {
  443. return err1
  444. }
  445. // 将操作记录插入记录表
  446. _, err1 = tx.Ctx(ctx).Model(dao.OrderStatusRecord.Table).Insert(model.OrderStatusRecord{
  447. OrderId: orderId,
  448. AlterBefore: curWorkflowNode.SortId,
  449. AlterAfter: nextWorkflowNode.SortId,
  450. RecordId: operatorId,
  451. RecordName: operatorName,
  452. CreatedAt: gtime.Now(),
  453. })
  454. return err1
  455. })
  456. return err
  457. }