orderHandler.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package controller
  2. import (
  3. . "app.yhyue.com/moapp/jybase/api"
  4. "app.yhyue.com/moapp/jybase/common"
  5. "context"
  6. "fmt"
  7. "github.com/gogf/gf/v2/database/gdb"
  8. "github.com/gogf/gf/v2/errors/gerror"
  9. "github.com/gogf/gf/v2/frame/g"
  10. "github.com/gogf/gf/v2/net/ghttp"
  11. "github.com/gogf/gf/v2/util/gconv"
  12. "github.com/pkg/errors"
  13. "jyOrderManager/internal/jyutil"
  14. "jyOrderManager/internal/logic/order"
  15. "jyOrderManager/internal/logic/product"
  16. "jyOrderManager/internal/model"
  17. "jyOrderManager/internal/service"
  18. "time"
  19. )
  20. var checkOrderProduct = func(ctx context.Context, orderCode string, param model.OrderParams, oldOrderRes ...g.Map) (productArr []product.JyProduct, removeOrderDetailIds []int64, err error) {
  21. var (
  22. actProduct = map[string]map[string]product.JyProduct{}
  23. orderMap g.Map
  24. existsOrderDetailIds = map[int64]bool{}
  25. update = false
  26. )
  27. if len(oldOrderRes) > 0 {
  28. orderMap, update = oldOrderRes[0], true
  29. }
  30. if update { //待审核和已完成订单禁止修改
  31. var orderDetailRes gdb.Result
  32. orderDetailRes, err = g.DB().Query(ctx, "SELECT id FROM jy_order_detail WHERE order_code=?", param.OrderCode)
  33. if err != nil || orderDetailRes.IsEmpty() {
  34. err = gerror.Wrapf(err, "为查询到订单明细")
  35. return
  36. }
  37. var (
  38. orderStatus = gconv.Int(orderMap["order_status"])
  39. auditStatus = gconv.Int(orderMap["audit_status"])
  40. )
  41. if auditStatus > 0 || orderStatus == 1 {
  42. err = errors.New("当前订单状态禁止修改")
  43. return
  44. }
  45. for _, m := range orderDetailRes.List() {
  46. existsOrderDetailIds[gconv.Int64(m["id"])] = true
  47. }
  48. }
  49. for _, tParam := range param.ProductArr {
  50. orderDetailId := gconv.Int64(tParam["id"])
  51. if update {
  52. if orderDetailId == 0 {
  53. err = fmt.Errorf("商品修改缺少id")
  54. return
  55. }
  56. existsOrderDetailIds[orderDetailId] = false
  57. }
  58. //参数注入
  59. tParam["phone"] = param.PersonPhone //开通手机号
  60. tParam["order_code"] = orderCode //订单号
  61. tParam["reqBuySet"] = param.BuySubject //购买主体
  62. tParam["reqCompanyName"] = param.CompanyName //公司名称
  63. productCode := gconv.String(tParam["product_code"])
  64. pFunc, pErr := product.JyProFunc.GetProductInitFuncByCode(productCode)
  65. if pErr != nil {
  66. err = gerror.Wrapf(pErr, "获取商品异常")
  67. return
  68. }
  69. pObj, pErr := pFunc(tParam)
  70. if pErr != nil {
  71. err = gerror.Wrap(pErr, fmt.Sprintf("获取%s商品异常", productCode))
  72. return
  73. }
  74. var (
  75. actCode = gconv.String(tParam["activityCode"]) //活动code
  76. checkCode = common.If(actCode != "", 2, 1).(int) //1:普通商品 2:活动商品
  77. )
  78. if actCode != "" {
  79. if _, ok := actProduct[actCode]; ok {
  80. actProduct[actCode][productCode] = pObj
  81. } else {
  82. actProduct[actCode] = map[string]product.JyProduct{productCode: pObj}
  83. }
  84. }
  85. if err = pObj.Check(ctx, checkCode); err != nil {
  86. return
  87. }
  88. productArr = append(productArr, pObj)
  89. }
  90. if len(productArr) == 0 {
  91. err = fmt.Errorf("订单商品为空")
  92. return
  93. }
  94. // 活动商品校验完整,防止缺少增加商品
  95. if len(actProduct) > 0 {
  96. now := time.Now()
  97. for actCode, productList := range actProduct {
  98. act := service.Product().GetActivityByCode(actCode)
  99. //当前用户是否有权限
  100. if !service.Product().PowerCheck(act.Code, jyutil.GetUserDeptIdFromCtx(ctx)) {
  101. err = fmt.Errorf("没有创建%s活动的权限", act.Name)
  102. return
  103. }
  104. if act == nil {
  105. err = fmt.Errorf("未知活动code %s", actCode)
  106. return
  107. }
  108. if now.After(act.EndTime) || now.Before(act.StartTime) {
  109. err = fmt.Errorf("活动%s不在有效期", actCode)
  110. return
  111. }
  112. if len(productList) != len(act.Products) {
  113. err = fmt.Errorf("活动产品不完整 %s", actCode)
  114. return
  115. }
  116. }
  117. }
  118. for orderDetailId, ok := range existsOrderDetailIds {
  119. if !ok {
  120. removeOrderDetailIds = append(removeOrderDetailIds, orderDetailId)
  121. }
  122. }
  123. return
  124. }
  125. // SaveOrderHandler 创建订单
  126. func SaveOrderHandler(r *ghttp.Request) {
  127. rData, err := func() (interface{}, error) {
  128. var (
  129. param model.OrderParams
  130. userName = r.Session.MustGet("entUserName", "").String()
  131. entUserId = r.Session.MustGet("entUserId", "").Int64()
  132. ctx = r.Context()
  133. )
  134. err := gconv.Struct(r.GetBody(), &param)
  135. if err != nil {
  136. return nil, gerror.Wrapf(err, "数据校验异常")
  137. }
  138. var (
  139. productArr []product.JyProduct
  140. orderCode = fmt.Sprintf("%s%s", time.Now().Format("150405"), common.GetRandom(6))
  141. )
  142. //产品参数校验
  143. productArr, _, err = checkOrderProduct(ctx, orderCode, param)
  144. if err != nil {
  145. return nil, err
  146. }
  147. //数据库操作
  148. if err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  149. //todo 插入订单表
  150. if _, err := g.DB().Ctx(ctx).Insert(ctx, "dataexport_order", g.Map{
  151. "order_code": orderCode,
  152. "order_money": param.OrderMoney,
  153. "pay_money": param.ContractMoney,
  154. "pay_way": param.PayType,
  155. "product_type": "组合商品",
  156. "order_status": 0,
  157. "user_phone": param.PersonPhone,
  158. "company_name": param.CompanyName,
  159. "is_backstage_order": 1,
  160. "commission": param.ChannelCommission,
  161. "order_channel": param.OrderChannel,
  162. "create_person": userName,
  163. "last_update_person": userName,
  164. "salesperson_entUserId": entUserId,
  165. "signing_subject": param.PaybackCompany,
  166. "audit_status": common.If(param.Save == 1, 0, 1),
  167. "buy_subject": param.BuySubject,
  168. "payment_user": param.PaymentUser,
  169. "zero_type": param.ZeroOrderType,
  170. "mark": param.OrderRemark,
  171. }); err != nil {
  172. return gerror.Wrap(err, "插入订单表异常")
  173. }
  174. //todo 订单详情表
  175. for _, p := range productArr {
  176. if err := p.SaveUpdate(ctx); err != nil {
  177. return gerror.Wrapf(err, "插入商品明细异常")
  178. }
  179. }
  180. //todo 销售业绩
  181. if err := order.SaveOrUpdateSaleMoneyTmp(ctx, orderCode, userName, param.SaleMoney); err != nil {
  182. return gerror.Wrapf(err, "销售业绩异常")
  183. }
  184. //todo 合同
  185. if err := order.SaveOrUpdateContract(ctx, orderCode, param.CompanyName, param.ContractMoney, param.Contract); err != nil {
  186. return gerror.Wrapf(err, "合同异常")
  187. }
  188. //回款计划
  189. if err := order.SaveOrUpdateReturnPlant(ctx, orderCode, param.ContractMoney, param.ReturnPlant); err != nil {
  190. return gerror.Wrapf(err, "回款计划异常")
  191. }
  192. return nil
  193. }); err != nil {
  194. return nil, gerror.Wrapf(err, "数据库操作异常")
  195. }
  196. return orderCode, nil
  197. }()
  198. if err != nil {
  199. g.Log().Errorf(r.Context(), "创建订单异常 %v", err)
  200. }
  201. r.Response.WriteJson(NewResult(rData, err))
  202. }
  203. // UpdateOrderHandler 订单修改
  204. func UpdateOrderHandler(r *ghttp.Request) {
  205. rData, err := func() (interface{}, error) {
  206. var (
  207. param model.OrderParams
  208. userName = r.Session.MustGet("entUserName", "").String()
  209. entUserId = r.Session.MustGet("entUserId", "").Int64()
  210. ctx = r.Context()
  211. )
  212. err := gconv.Struct(r.GetBody(), &param)
  213. if err != nil {
  214. return nil, gerror.Wrapf(err, "数据校验异常")
  215. }
  216. orderRes, err := g.DB().GetOne(ctx, "SELECT * FROM dataexport_order WHERE order_code=?", param.OrderCode)
  217. if err != nil || orderRes.IsEmpty() {
  218. err = gerror.Wrapf(err, "未知订单")
  219. return nil, err
  220. }
  221. //产品参数校验
  222. productArr, removeIds, err := checkOrderProduct(ctx, param.OrderCode, param, orderRes.Map())
  223. if err != nil {
  224. return nil, err
  225. }
  226. //数据库操作
  227. if err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  228. if _, err := g.DB().Ctx(ctx).Update(ctx, "dataexport_order", g.Map{
  229. "order_money": param.OrderMoney,
  230. "pay_money": param.ContractMoney,
  231. "pay_way": param.PayType,
  232. "product_type": "组合商品",
  233. "order_status": 0,
  234. "user_phone": param.PersonPhone,
  235. "company_name": param.CompanyName,
  236. "is_backstage_order": 1,
  237. "commission": param.ChannelCommission,
  238. "order_channel": param.OrderChannel,
  239. "create_person": userName,
  240. "last_update_person": userName,
  241. "salesperson_entUserId": entUserId,
  242. "signing_subject": param.PaybackCompany,
  243. "audit_status": common.If(param.Save == 1, 0, 1),
  244. "buy_subject": param.BuySubject,
  245. "payment_user": param.PaymentUser,
  246. "zero_type": param.ZeroOrderType,
  247. "mark": param.OrderRemark,
  248. }, "order_code=? and order_status=0", param.OrderCode); err != nil {
  249. return gerror.Wrap(err, "修改订单表内容异常")
  250. }
  251. //todo 删除已经不存在的商品
  252. for _, id := range removeIds {
  253. if _, err := g.DB().Update(ctx, "jy_order_detail", g.Map{
  254. "status": 2,
  255. }, "id=? and order_code=?", id, param.OrderCode); err != nil {
  256. return gerror.Wrapf(err, "删除旧订单明细内容异常")
  257. }
  258. }
  259. //todo 订单详情表
  260. for _, p := range productArr {
  261. if err := p.SaveUpdate(ctx); err != nil {
  262. return gerror.Wrapf(err, "插入商品明细异常")
  263. }
  264. }
  265. //todo 销售业绩 p610.管理后台创建订单,订单状态为已完成(不包含从未完成改成已完成,未提交的状态),“销售人员”、“销售业绩”、“销售渠道”不支持编辑;
  266. if gconv.Int(orderRes["order_status"]) == 0 {
  267. err = order.SaveOrUpdateSaleMoneyTmp(ctx, param.OrderCode, userName, param.SaleMoney)
  268. if err != nil {
  269. return err
  270. }
  271. }
  272. //todo 合同
  273. if err := order.SaveOrUpdateContract(ctx, param.OrderCode, param.CompanyName, param.ContractMoney, param.Contract); err != nil {
  274. return gerror.Wrapf(err, "合同异常")
  275. }
  276. //todo 回款计划
  277. if err := order.SaveOrUpdateReturnPlant(ctx, param.OrderRemark, param.ContractMoney, param.ReturnPlant); err != nil {
  278. return gerror.Wrapf(err, "回款计划异常")
  279. }
  280. return nil
  281. }); err != nil {
  282. return nil, gerror.Wrapf(err, "数据库操作异常")
  283. }
  284. return nil, err
  285. }()
  286. if err != nil {
  287. g.Log().Errorf(r.Context(), "订单修改异常 %v", err)
  288. }
  289. r.Response.WriteJson(NewResult(rData, err))
  290. }
  291. // GetContractPdfHandler 电子pdf合同
  292. func GetContractPdfHandler(r *ghttp.Request) {
  293. rData, err := func() (interface{}, error) {
  294. rj, err := r.GetJson()
  295. if err != nil {
  296. return nil, errors.Wrap(err, "请求参数格式异常")
  297. }
  298. var (
  299. orderCode = rj.Get("orderCode").String()
  300. userName = r.Session.MustGet("entUserName", "").String()
  301. )
  302. pdfPath, err := order.GetContractPdf(r.Context(), orderCode, userName)
  303. if err != nil {
  304. return nil, err
  305. }
  306. return pdfPath, nil
  307. }()
  308. if err != nil {
  309. g.Log().Errorf(r.Context(), "生成电子pdf合同出错 %v", err)
  310. }
  311. r.Response.WriteJson(NewResult(rData, err))
  312. }